提问人:Richard Thorn 提问时间:9/12/2023 更新时间:9/18/2023 访问量:189
如何使用 Mac 在 CSV 文件中查找换行符样式(CRLF、CR 或 LF)
How to find line break style (CRLF, CR or LF) in a CSV-file using Mac
问:
我需要使用 Mac 查找 csv 文件中使用的换行符类型。我已将数据集从 SPSS(一种统计软件)导出到 CSV 文件。这个CSV文件将被发送到寄存器中,我需要提供有关该文件的信息,例如文件中使用的换行符样式。
当我在 Mac 上的“文本编辑”中打开 CSV 文件时,我没有看到与换行符对应的符号(没有说 \r\n、\r 或 \n。只是有一个新行,没有表示换行符的符号。我无法找到 SPSS 中用作默认值的内容或如何自定义它。我尝试通过终端应用程序和Visual studio代码(我可以访问的内容)运行该文件,但没有指示换行符的符号。有谁知道如何确定在这种情况下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 可能不再存在。CRLF
LF
CR
以下是适用于大多数情况的解决方案:
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
评论
file
file YOURFILE.CSV