2013-06-25 5 views
6

मैं एक रिकॉर्ड बनाया है कि इसपाइप के साथ अल्पविराम के बदलें, लेकिन नहीं अल्पविराम के दोहरे उद्धरण चिह्नों

"BOSW0001","Mr","Wayne","Boswell","Wayne,Jessica & Lyn","31 Baker St" 
"ELLI0007","Mrs","Bronwyn","Elliott","Bronwyn, Paul & Arianne","98A Dandaraga Rd" 
"KENN0001","Mr","Leigh","Kenning","Leigh & Beth,Cole","22 Lake St" 

की तरह लग रहा है में संलग्न मैं अल्पविराम बदले बिना पाइप (|) के साथ अल्पविराम (,) बदलना चाहते हैं

"Leigh & Bethie,Coles" 
"Waynez,Jessy & Lyne" 
"Bronwynie, Paula & Arianne" 

नियमित अभिव्यक्ति या अन्य विधियों का उपयोग करके मैं इसे कैसे कर सकता हूं?

उत्तर

12

आप एक नियमित अभिव्यक्ति के साथ यह मत करो; आप इसे एक उचित सीएसवी पार्सर के साथ करते हैं। Text::CSV_XS का उपयोग करके एक (अवांछित) उदाहरण यहां दिया गया है - बिज़ में सबसे अच्छा।

use strict; 
use warnings; 

use Text::CSV_XS; 

my $in_file = "whatever.csv"; 
my $out_file = "new.dat"; 

open my $fh, '<', $in_file or die "$in_file: $!"; 
open my $out_fh, '>', $out_file or die "$out_file: $!"; 

my $in_csv = Text::CSV_XS->new; 
my $out_csv = Text::CSV_XS->new({ sep_char => '|', eol => "\n" }); 

while(my $row = $in_csv->getline($fh)) { 
    $out_csv->print($out_fh, $row); 
} 
+3

वास्तव में आपके अनचाहे उदाहरण में 3 बग हैं: 1. 'रीडलाइन'' getline' होना चाहिए; 2. 'new' के विकल्प एक हैशफ में होना चाहिए i.e.' नया ({sep_char => '|'}) '; 3. आपको सभी पंक्तियों को एक पंक्ति में मुद्रित होने से रोकने के लिए 'eol' विकल्प निर्दिष्ट करना पड़ सकता है (डिफ़ॉल्ट रूप से यह '$ \' और '$ \' डिफ़ॉल्ट रूप से अनिश्चित है)। शायद आप 'नया ({sep_char =>' | ', eol => $ /}) का उपयोग कर सकते हैं। – doubleDown

+1

@ डबल डाउन धन्यवाद - अपडेट किया गया। – friedo

0

संदर्भ में अल्पविराम (डबल उद्धरण के बीच) प्रकट होता है उपयोग के बारे में कैसे:

s/","/"|"/g 
+1

क्या होगा यदि किसी रिकॉर्ड में एक अल्पविराम उद्धरण के बाद एक कॉमा होता है? – friedo

+0

@paddy यह पूरी तरह से काम करता है अगर regex धन्यवाद – Soncire

+0

कोई समस्या नहीं है। यह इतना लोकप्रिय नहीं था (मुझे लगभग उतना ही नीचे गिरा दिया गया था), क्योंकि वहां कई संभावित मामले हैं जहां यह टूट जाएगा। लेकिन अक्सर आप अपने डेटा के बारे में कुछ चीजें जानते हैं और त्वरित, आसान समाधान काफी अच्छा है। वास्तव में, एक जटिल समाधान पर बहुत समय व्यतीत करने से बेहतर, जो आवश्यक नहीं हो सकता है। – paddy

6

बस TIMTOWTDI के लिए, यहां कोर मॉड्यूल Text::ParseWords का उपयोग कर एक उदाहरण है।

#!/usr/bin/env perl 

use strict; 
use warnings; 

use Text::ParseWords 'parse_line'; 

foreach my $line (<DATA>) { 
    print join '|', parse_line(',', 1, $line); 
} 

__DATA__ 
"BOSW0001","Mr","Wayne","Boswell","Wayne,Jessica & Lyn","31 Baker St" 
"ELLI0007","Mrs","Bronwyn","Elliott","Bronwyn, Paul & Arianne","98A Dandaraga Rd" 
"KENN0001","Mr","Leigh","Kenning","Leigh & Beth,Cole","22 Lake St" 
+0

आदमी को साझा करने के लिए धन्यवाद – Soncire

+1

मुझे नहीं पता कि इतने सारे लोग टेक्स्ट :: सीएसवी के लिए क्यों पहुंचते हैं जब यह कोर मॉड्यूल आमतौर पर नौकरी भी करता है। –

संबंधित मुद्दे

 संबंधित मुद्दे