CSV文件换行符处理需求:保留双引号内LF,替换行尾LF为CRLF
解决CSV换行符转换问题:保留引号内LF,行尾LF转CRLF
这里有几个实用的方法帮你搞定这个CSV格式调整需求,既能精准保留双引号包裹内容里的换行符,又能把每行末尾的LF替换成CRLF:
方法一:用Python csv标准库(最稳妥)
Python的csv模块天生就支持识别带双引号的字段,完全不用自己手动处理引号内的换行逻辑,我自己处理这类问题时首选这个方案:
import csv # 替换成你的源文件和目标文件路径 input_path = "source.csv" output_path = "converted.csv" with open(input_path, 'r', newline='', encoding='utf-8') as infile, \ open(output_path, 'w', newline='\r\n', encoding='utf-8') as outfile: # 创建CSV读取器和写入器 reader = csv.reader(infile) writer = csv.writer(outfile) # 逐行读取并写入,csv模块会自动保留字段内的LF for row in reader: writer.writerow(row)
原理说明:
- 打开输入文件时指定
newline='',让csv模块自行处理换行符识别,不会把引号内的LF误判成行分隔符 - 打开输出文件时指定
newline='\r\n',确保写入每一行后自动添加CRLF作为行尾分隔符 - 带引号字段内的LF会被完整保留,因为csv.reader会将整个引号包裹内容识别为一个完整字段
方法二:用Awk命令行工具(适合快速处理)
如果你习惯用命令行操作,也可以用Awk实现,核心是跟踪当前是否处于双引号包裹的状态,状态内的LF保留,状态外的LF替换成CRLF:
BEGIN { in_quote = 0 } { # 统计当前行的双引号数量 quote_count = gsub(/"/, "&") # 奇数个引号说明进入/退出引号状态 if (quote_count % 2 != 0) { in_quote = !in_quote } # 不在引号内则输出CRLF,在引号内保留原LF if (!in_quote) { printf "%s\r\n", $0 } else { printf "%s\n", $0 } }
使用方式:把上面的脚本保存为convert_csv.awk,然后执行:
awk -f convert_csv.awk source.csv > converted.csv
原理说明:
- 通过
in_quote变量跟踪当前是否处于双引号内部 - 每遇到奇数个双引号,就切换状态标记
- 不在引号内时用
printf "%s\r\n"输出CRLF;在引号内则用printf "%s\n"保留原换行
内容的提问来源于stack exchange,提问作者chandan T
相关产品推荐
相关产品推荐

