-1

我在 OSX El Capitan 中解析 Excel CSV 文件,CSV 在这里

问题是换行符被标记为 '\x0d' (CR)。

1]我已经能够使用设置为'x0a'(NL)的换行符来转换文件

$> perl -e 'open(fh, "<coord2.csv") or die("can t open file"); 
   binmode(fh); $/=\10; 
   while ($t=<fh>) { $t =~ s/\x0d/\x0a/g; print "$t"; } print "\n"; '

但在此之前,我尝试了另外两种方法,但都失败了,我想知道你是否对它们失败的原因有一些解释。

2]我尝试了一段时间以一次啜饮所有文件:

$> cat coord2.csv | perl -e 'undef $/; $t=<>; print "$t \n"; '

但在输出中我看不到所有文件,我只看到:

Prelevacampioni ZARA;45.0640, 11.1943;F ;F 9.954467;F00;F599242;F

3]我也尝试设置$/变量,使用:

$> cat coord2.csv | perl -e '$/="\x0d"; @L=<>; 
                       for (@L) { print $_; } print "\n"; '

但同样,我只看到与 [2] 点相同的输出。

我很困惑,你能解释一下我在 [2] 和 [3] 点做错了什么吗?

4

1 回答 1

0

感谢评论,我能够理解示例 [2] 和 [3] 中的奇怪行为。我在这里为将来可能遇到同样问题的人写下解决方案。

关键是 OSX 用 NL ='\n' = 'x0a' 编码换行符,而在 CVS 文件中,行尾用 CR = '\r' = 'x0d' 编码。Perl 可以正确读取行,但输出被破坏,因为 CR 使 Perl 始终在同一行上写入。

因此,示例 [2] 和 [3] 的更正代码为:

[2] $> cat coord2.csv | perl -e 'undef $/; $t=<>; 
           $t =~ s/\x0d/\x0a/g; print "$t \n"; '


[3] $> cat coord2.csv | perl -e '$/="\x0d"; @L=<>; 
          for (@L) { s/\x0d/\x0a/g; print $_; } print "\n"; '
于 2017-08-30T13:14:57.697 回答