问题:我有在 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 b/c 我开始获取带有引用数据的更奇怪的数据文件,可能带有嵌入的换行符等。为了让这个模块读取这些文件,Text::CSV_XS: :getline() 要求您指定行尾字符。(我不能像上面那样读取每一行,tr/\n\r//d,他们用不能正确处理嵌入换行符的 Text::CSV b/c 对其进行解析)。如何正确检测任意文件是否使用 windows 或 *nix 样式的行尾,以便我可以告诉 Text::CSV_XS::eol() 如何 chomp()?
我在 CPAN 上找不到仅检测行尾的模块。我不想首先通过 dos2unix 转换我的所有数据文件,b/c 文件很大(数百 GB),每个文件花费 10 多分钟来处理如此简单的事情似乎很愚蠢。我想过编写一个函数来读取文件的前几百个字节并计算 LF 和 CRLF,但我拒绝相信这没有更好的解决方案。
有什么帮助吗?
注意:所有文件要么完全以windows-line 结尾,要么以*nix 结尾,也就是说,它们不会混合在一个文件中。