如何使用 Mac 在 CSV 文件中查找换行符样式(CRLF、CR 或 LF)

How to find line break style (CRLF, CR or LF) in a CSV-file using Mac

提问人:Richard Thorn 提问时间:9/12/2023 更新时间:9/18/2023 访问量:189

问:

我需要使用 Mac 查找 csv 文件中使用的换行符类型。我已将数据集从 SPSS(一种统计软件)导出到 CSV 文件。这个CSV文件将被发送到寄存器中,我需要提供有关该文件的信息,例如文件中使用的换行符样式。

当我在 Mac 上的“文本编辑”中打开 CSV 文件时,我没有看到与换行符对应的符号(没有说 \r\n、\r 或 \n。只是有一个新行,没有表示换行符的符号。我无法找到 SPSS 中用作默认值的内容或如何自定义它。我尝试通过终端应用程序和Visual studio代码(我可以访问的内容)运行该文件,但没有指示换行符的符号。有谁知道如何确定在这种情况下CSV文件中使用的换行符样式?

macOS CSV 换行符 LF

评论

2赞 Mark Setchell 9/13/2023
如果无法看到您的文件,我想该命令会告诉您。只需在终端中运行以下命令filefile YOURFILE.CSV

答:

0赞 user21508463 9/12/2023 #1

可以使用二进制编辑器在 Visual Studio 中打开该文件。您将看到所有字符。

评论

0赞 Richard Thorn 9/12/2023
谢谢!我试过了,但我只在换行符的位置得到了一个浅灰色的点。它没有说\r\n、\r或\n。我做错了什么吗?
0赞 9/12/2023
@RichardThorn:二进制编辑器列出了 ASCII 代码。
0赞 Richard Thorn 9/12/2023
明白了!因此,如果我得到 0A,那将对应于 \n,对吧?非常感谢!
0赞 9/12/2023
@RichardThorn:0A为换行,0D为回车。
1赞 Fravadona 9/13/2023 #2

根据 RFC 4180,是 CSV 的标准记录分隔符,但也经常使用。忘记以分隔符分隔的记录,因为这种 CSV 可能不再存在。CRLFLFCR

以下是适用于大多数情况的解决方案:

awk '{print (/\r$/ ? "CRLF" : "LF"); exit}' file.csv

前一种方法的问题在于 CSV 记录可以跨越多行,因此遇到 CSV 记录并不能保证您到达了记录的末尾。解决方法是转到文件末尾并检查它是如何终止的。LF

你可以使用 perl 来做到这一点:

perl -le '
    open(F, '<', $ARGV[0]) or die $!."\n";
    seek(F, -2, 2);
    read(F, $e, 2);
    close(F);
    if("\r\n" eq $e) {print "CRLF"}
    elsif("\n" eq ($e = substr($e, -1))) {print "LF"}
    elsif($e eq "\r") {print "CR"}
' file.csv
0赞 dawg 9/18/2023 #3

鉴于:

printf 'Line 1\r\nLine 2\r\n' >f1.txt
printf 'Line 1\nLine 2\n' >f2.txt 

您可以在 MacOS 上使用来确定线路终止:file

file f{1..2}.txt
f1.txt: ASCII text, with CRLF line terminators
f2.txt: ASCII text

或:awk

awk 'FILENAME in fn{next}
{fn[FILENAME]; print FILENAME, /\r$/ ? "CRLF" : "LF"}' f{1..2}.txt

或者 Ruby:

ruby -e 'ARGV.each{|fn| 
    puts "#{fn}: #{File.open(fn).readline[/\r\n$/] ? "CRLF" : "LF"}"}' f{1..2}.txt

或者 Perl:

perl -E 'for $fn (@ARGV){
             open($fh, $fn); say "$fn: ", <$fh>=~/\r\n$/ ? "CRLF" : "LF"}' f{1..2}.txt

或者在外壳中:

for fn in f{1..2}.txt; do
    head -n 1 "$fn" | grep -q "\r$" 
    [ $? -eq 0 ] && echo "$fn: CRLF" || echo "$fn: LF"
done

任何这些(除了 )打印:file

f1.txt: CRLF
f2.txt: LF