使用perl向CSV添加引号

Lit*_*ode 0 regex perl replace

我有一个看起来如下的CSV:

A,01,ALPHA
00,D,CHARLIE
E,F,02
Run Code Online (Sandbox Code Playgroud)

这是转换后所需的文件:

"A",01,"ALPHA"
00,"D","CHARLIE"
"E","F",02
Run Code Online (Sandbox Code Playgroud)

如您所见,完全数字的字段不加引号,而引用alpha(或字母数字)字段.

在Perl中解决这个问题的合理方法是什么?

已经在下面评论过了,但我尝过类似的东西

perl -pe 's/(\w+)/"$1"/g'
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为\ w显然已经接受了数字.

xxf*_*xxx 5

我建议不要重新发明轮子,而是使用已经存在的模块,如zdim建议的那样.以下是使用Text :: CSV_XS的示例

test.pl

#!/usr/bin/env perl

use warnings;
use strict;

use Text::CSV_XS;
use Scalar::Util qw( looks_like_number );

my $csv = Text::CSV_XS->new();
while (my $row = $csv->getline(*STDIN)) {
    my @quoted_row = map { looks_like_number($_) ? $_ : '"'. $_ .'"' } @$row;
    print join(',',@quoted_row) . "\n";
}
Run Code Online (Sandbox Code Playgroud)

产量

cat input | perl test.pl
"A",01,"ALPHA"
00,"D","CHARLIE"
"E","F",02
Run Code Online (Sandbox Code Playgroud)