2017-01-04 7 views
-2

間違ってエクスポートされたcsvファイルがあります。数字を含むフィールドの中には、ドットの代わりに小数点以下をカンマで区切った文字列として誤ってエクスポートされています。ここでコンマを引用符付きの値のドットで置き換えた後、引用符を削除する

は例のカップルです:

"GREEN,"15,4",55,"15,5",64,"17,0","18,9",107,145,21,38, "BLUE","15,1",46,"15,2",51,"11,4","13,5",89,96,25,7,

だから、私は引用符で番号をドットにコンマを切り替えて、その後のすべての番号からの引用符を削除します。

誰でも私をここで助けてくれますか?

+5

これを自分で解決しようとしたことを示すと、人々はあなたを助けるのにもっと寛大であることがわかります – fugu

+1

あなたの例は**混乱しています**数字は引用符で囲まれていますか? –

+0

@Meninx '' 15.4 ''のような値は引用符なしで' 15.4'になるはずです。 – michaPau

答えて

3

CSVパーサを使用し、これは容易になる:

#!/usr/bin/perl 
use warnings; 
use strict; 

use Text::CSV_XS; 

my $csv = Text::CSV_XS->new({ binary => 1, auto_diag => 1 }); 

while (my $row = $csv->getline(\*DATA)) { 
    s/,/./ for @$row; 
    $csv->say(\*STDOUT, $row); 
} 


__DATA__ 
"GREEN","15,4",55,"15,5",64,"17,0","18,9",107,145,21,38, 
"BLUE","15,1",46,"15,2",51,"11,4","13,5",89,96,25,7, 

上記の例では、それ実行可能なスタンドアロンにするためにインラインデータを使用しています - あなたは、おそらく代わりに、入力および出力ファイルを使用したいと思いますDATAおよびSTDOUTである。

特に「文字列」ではなく「数字」で囲まれた引用符を使用したい場合は、keep_meta_infoを使用するか、必要なときに再追加するだけです。

+0

なぜdownvote?これは正しい解決策です! – Toto

+0

正規表現があまりにも一般的で正当な文字列と一致する可能性がありますか? –

0
,(?!(?:[^"]*"[^"]*")*[^"]*$) 

あなたは、これが" .Seeデモの間,を削除することができます。

https://regex101.com/r/t5Euq1/1

+0

なぜdownvotedですか? – vks

関連する問題