2017-01-04 123 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

也许因为正则表达式太泛型,可能会匹配一个合法的字符串? –