问题:我拥有在Windows和\* nix上生成的数据(大多数为CSV格式),并且主要在\* nix上进行处理。 Windows使用CRLF作为行结尾,而Unix使用LF。 对于任何特定的文件,我都不知道它具有Windows还是\* nix行结尾。 目前为止,我一直在编写类似于以下内容来处理差异:
while (<$fh>){
tr/\r\n//d;
my @fields = split /,/, $_;
# ...
}
在*nix上,\n部分相当于chomping,此外,如果它是由Windows生成的文件,则还会去掉\r(CR)。 但现在我想使用Text::CSV_XS,因为我开始得到更奇怪的带引号数据文件,可能包含嵌入式换行符等。为了使该模块读取此类文件,Text::CSV_XS::getline()要求您指定行尾字符。 (我不能像以上那样逐行阅读,tr/ \ n \ r // d,然后使用Text::CSV解析它,因为这样无法正确处理嵌入的换行符)。 我如何“正确”检测任意文件是否使用Windows或*nix样式的行结尾,以便告诉Text::CSV_XS ::eol()如何chomp()? 我在CPAN上找不到一个简单检测行结尾的模块。 我不想通过dos2unix先转换所有数据文件,因为这些文件很大(数百GB),并且每个文件花费超过10分钟来处理如此简单的问题似乎很愚蠢。 我考虑编写一个函数,该函数读取文件的前几百个字节并计算LF和CRLF的数量,但我拒绝相信这没有更好的解决方案。 有什么帮助吗?
注意:所有文件都具有完全的Windows行尾或*nix结束,即它们不是在单个文件中混合的。