【问题标题】:Remove mysterious line breaks in CSV file using Perl使用 Perl 删除 CSV 文件中的神秘换行符
【发布时间】:2016-06-22 21:47:08
【问题描述】:

我有一个使用 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;

但事实并非如此。

【问题讨论】:

  • 你不需要[],它是一个字符类。既然都是你说的,[CR][LF],试试s/(?:\r\n)+//g。括号() 用于分组,因此+ 适用于整个事物,而?: 在内部以使它们不被捕获,因为您不需要记住里面的内容。
  • 使用正确处理嵌入换行符的 CSV 解析模块,例如 Text::CSV。
  • 同样的问题,但他们建议使用 $row->[8] =~ s/[\r\n]+//g; - 这是我尝试过的。然而这并没有奏效。

标签: perl csv line-breaks


【解决方案1】:

您没有提供太多 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,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多