2017-01-04 154 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, 

示例使用內聯數據,使其可以運行獨立的 - 你可能會想要使用的輸入和輸出文件,而不是DATASTDOUT

如果您特別想保留「字符串」而不是「數字」的引號,那麼您可以使用keep_meta_info或僅在需要時重新添加引號。

+0

爲什麼downvote?這是正確的解決方案! – Toto

+0

也許因爲正則表達式太泛型,可能會匹配一個合法的字符串? –