使用 Perl 删除 CSV 文件中神秘的换行符
Remove mysterious line breaks in CSV file using Perl
我有一个正在使用 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;
但事实并非如此。
您没有提供太多 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,
我有一个正在使用 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;
但事实并非如此。
您没有提供太多 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,