2.2GB+大CSV导入BigQuery列数不匹配报错的修复方法咨询
大体积CSV导入BigQuery报错的校验与修正方案
通用校验方案
针对2.2GB级别的大文件,无需加载全量内容到内存,直接用流处理工具即可完成校验:
- 先批量定位所有列数异常的行,把
预期总列数替换为你表结构的实际字段数即可:
该命令可在几秒到几十秒内完成全文件扫描,输出所有不符合列数要求的行位置。awk -F ',' '{if(NF!=预期总列数) print "行号:"NR", 实际列数:"NF}' 源文件.csv - 定向查看异常行上下文确认规律,把
目标行号替换为上一步输出的异常行号即可:
你已经排查出断行固定出现在sed -n '目标行号-1,目标行号+1p' 源文件.csvInstituto/Fundação和Butantan之间,可直接进入修复步骤。
错误修正方案
grep本身为文本查找工具,不直接支持内容修改,你可以用sed或awk实现断行自动拼接,处理过程为流处理,内存占用极低,适配大文件场景:
方法1:sed快速拼接(适合你当前的断行规律)
逻辑为识别末尾为Instituto或Fundação的行,自动和下一行拼接,删除中间的换行符:
sed -E '/(Instituto|Fundação)$/{N;s/\n//}' 源文件.csv > 修正后文件.csv
参数说明:
-E启用扩展正则表达式/(Instituto|Fundação)$/匹配行尾为指定关键词的行N读取下一行内容追加到当前处理缓冲区s/\n//删掉两行之间的换行符,完成拼接
方法2:awk精准拼接(避免误改其他内容)
如果需要同时匹配后半段开头为Butantan,可以用awk做双向匹配,准确率更高:
awk '{ if(prev != "") { print prev $0; prev = "" } else if($0 ~ /(Instituto|Fundação)$/) { prev = $0 } else { print $0 } }' 源文件.csv > 修正后文件.csv
修正后校验
修复完成后再次扫描全文件列数,确认无异常后即可导入BigQuery:
awk -F ',' '{if(NF!=预期总列数) print NR}' 修正后文件.csv
如果命令无任何输出,说明所有行列数均符合要求。
内容的提问来源于stack exchange,提问作者Marcelo Soares
相关产品推荐
相关产品推荐

