使用Perl删除CSV文件中的神秘换行符

时间:2016-06-22 21:47:09

标签: perl csv line-breaks

我有一个我使用Perl解析的CSV文件。该文件是Solidworks 2015生成的BOM,保存为XLS文件,然后在Excel中打开并保存为CSV文件。

有些细胞有换行符。当我从文件中读取带有这样一个单元格的行时,该行会出现换行符。例如,以下是其中一行读取如下:

74,,74,1,1,"SJ-TL303202-DET-074-
001",PDSI,"2.25"" DIA. X  8.00""",A2,513,1,

它在Perl中以单行读入。

当我在Notepad ++中翻转显示所有字符时,我可以看到换行符由[CR] [LF]引起。

所以我认为这样可以删除换行符:

$line =~ s/[\r\n]+//g;

但事实并非如此。

1 个答案:

答案 0 :(得分:2)

您不会提供大量CSV数据样本,但您展示的内容完全有效。如果您愿意,文本字段可以包含换行符,只要它用双引号括起来

即可

只要在构造函数调用中启用binary选项,Text::CSV模块就会非常愉快地处理它,并且您可以在再次将数据重新写入之前重新格式化数据

该程序期望输入文件的路径作为命令行上的参数,并将修改后的数据写入STDOUT,您可以在命令行上重定向,如下所示

$ perl fix_csv.pl input.csv > output.csv

我假设您的数据只包含7位ASCII数据,无论您是在Windows系统上还是在Linux上运行它都应该有效

use strict;
use warnings 'all';

my ($csv_file) = @ARGV;

use Text::CSV;

open my $fh, '<', $csv_file or die qq{Unable to open "$csv_file" for input: $!};

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

while ( my $row = $csv->getline( $fh ) ) {

    tr/\r\n//d for @$row;

    $csv->combine(@$row);
    print $csv->string, "\n";
}

输出

74,,74,1,1,SJ-TL303202-DET-074-001,PDSI,"2.25"" DIA. X  8.00""",A2,513,1,