3

我有一个输入 CSV 文件,其中包含以下内容:

SD-32MM-1001,"100.00",4/11/2012
SD-32MM-1001,"1,000.00",4/12/2012

postgresql COPY我需要为其他一些处理管道( )取出数值格式。

是否有一个文本过滤器可以将 FS 上的列分开,而不用窥视带引号的字符串?目前我得到:

$ tail +2 /tmp/foo.csv|awk -F, '{print NF}'
3
4

同样的部分值cut

我必须留在 Linux 上。

谢谢。

4

3 回答 3

3

GNU awk 可以处理这个你只需要设置FPAT来描述你认为的字段:

$ awk '{print NF}' FPAT="([^,]+)|(\"[^\"]+\")" file
3
3

$ awk '{print $2}' FPAT="([^,]+)|(\"[^\"]+\")" file
"100.00"
"1,000.00"
于 2013-04-19T18:05:27.600 回答
1

Using a script and a proper parser (the good solution: awk & cut are not suited for this particular needs):

use strict; use warnings;

use Text::CSV;

my @rows;
my $csv = Text::CSV->new ()
                or die "Cannot use CSV: ".Text::CSV->error_diag ();

open my $fh, "<:encoding(utf8)", "/tmp/file.csv" or die "$!";
while ( my $row = $csv->getline( $fh ) ) {

    # printing line 2, last field
    $. == 2 and print $row->[-1];
}
$csv->eof or $csv->error_diag();
close $fh;

Output

4/12/2012
于 2013-04-19T17:56:00.227 回答
0

sudo_O 的建议应该有效——除非你的字段里面有双引号,这可能发生在标准 CSV 数据中,例如。

field1,field2,"field,3","field4 ""has some quotes"" in it",field5

要处理这些问题,您可以使用我编写的名为 csvquote 的程序来包装标准 UNIX 命令,如 cut、awk 等,如下所示:

csvquote /tmp/foo.csv | tail +2 | awk -F, '{print NF}'

这通过在引用字段中查找逗号并将它们临时替换为 awk 可以安全处理的非打印字符来工作。然后,当您想从字段创建输出时,管道将需要恢复这些逗号:

csvquote /tmp/foo.csv | cut -d, -f2 | csvquote -u

你可以在这里找到代码:https ://github.com/dbro/csvquote

于 2013-05-04T21:31:39.647 回答