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"

正規表現やその他の方法を使用してこれを行うにはどうすればよいですか?

4

3 に答える 3

12

正規表現では行いません。適切な CSV パーサーでそれを行います。これは、 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 );
}
于 2013-06-25T23:44:09.863 に答える
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"
于 2013-06-26T03:09:38.837 に答える
0

コンマが表示されるコンテキスト (二重引用符の間) を利用するのはどうですか:

s/","/"|"/g
于 2013-06-25T23:40:28.503 に答える