Bash中处理含单元格换行符的XLSX转CSV文件问题求助
解决CSV单元格含换行导致列分割异常的问题
方案1:用专门的CSV工具(最省心)
直接使用csvkit套件中的csvcut工具,它原生遵循CSV规范,能自动识别带换行、引号的单元格,不会出现列错位:
- 安装csvkit:
Debian/Ubuntu系统:sudo apt install csvkit
RHEL/CentOS系统:sudo yum install csvkit
通用方式(需Python环境):pip install csvkit - 提取指定列(列索引从1开始,与awk一致):
csvcut -c 2,7,27,29,30,31 your_input.csv > extracted_cols.csv
方案2:用GNU awk的FPAT字段匹配(无需额外安装)
GNU awk提供FPAT参数,可自定义CSV字段的匹配规则,精准识别被双引号包裹的含换行单元格:
创建awk脚本(例如extract_cols.awk):
BEGIN { # 字段规则:要么是无引号的非逗号内容,要么是双引号包裹的任意内容(包含换行) FPAT = "([^,]+)|(\"[^\"]*\")" } { # 按需求输出指定列,用|分隔 print $2 "|" $7 "|" $27 "|" $29 "|" $30 "|" $31 }
执行脚本:awk -f extract_cols.awk your_input.csv
方案3:转换XLSX时提前规范格式
如果使用LibreOffice/OpenOffice将XLSX转CSV,可添加参数强制让带换行的单元格被双引号包裹,从源头避免后续处理异常:libreoffice --headless --convert-to csv:"Text - txt - csv (StarCalc)" --infilter="CSV:44,34,76,1" your_input.xlsx
参数说明:
44:逗号作为字段分隔符34:双引号作为字段包围符76:输出UTF-8编码1:将第一行视为表头(无需表头可改为0)
内容的提问来源于stack exchange,提问作者Salvador Guram
相关产品推荐
相关产品推荐

