如何解决2GB级CSV导入PostgreSQL的报错并筛选指定列?
解决PostgreSQL导入Kaggle食谱CSV的问题及指定列导入方法
一、先解决CSV格式错误(根源问题)
你遇到的两个错误都是CSV格式不规范导致的:
unquoted newline found in data:食谱的ingredients、directions字段本身包含换行,但没被双引号包裹,PostgreSQL误将其识别为行分隔符。extra data after last expected column:要么是字段内包含逗号(默认分隔符)未加引号,导致拆分出多余列;要么是CSV列数和表列数不匹配。
直接用sed删换行是治标不治本的,会破坏字段内容。推荐用Python脚本批量规范CSV并筛选需要的列:
import csv # 替换成你的原CSV路径和输出路径 input_path = "原食谱数据集.csv" output_path = "清理后_仅指定列.csv" # 要保留的目标列 target_columns = ["title", "ingredients", "directions", "NER"] with open(input_path, "r", encoding="utf-8") as infile, open(output_path, "w", encoding="utf-8", newline="") as outfile: reader = csv.DictReader(infile) writer = csv.DictWriter(outfile, fieldnames=target_columns, quoting=csv.QUOTE_ALL) writer.writeheader() for row in reader: # 仅写入指定列,自动处理字段内的换行和逗号 writer.writerow({col: row[col] for col in target_columns})
这个脚本会把所有字段用双引号包裹,保留字段内的换行/逗号,同时直接过滤出你需要的4列,彻底解决格式问题。
二、pgAdmin导入步骤(针对清理后的CSV)
- 确保你的PostgreSQL表已创建,列名与
target_columns一致(顺序不影响)。 - 右键目标表 → 选择Import/Export Data。
- 在导入配置窗口:
- 选择Import,指定清理后的CSV文件路径。
- 编码选择
UTF8(和CSV编码一致)。 - 分隔符设为逗号(
,),如果原CSV用其他分隔符(如制表符)则对应修改。 - 勾选Header(因为CSV包含表头行)。
- 切换到Options标签页:勾选Quoted,引号字符设为
",这样PostgreSQL会正确识别带引号的字段内容。 - 若表列和CSV表头不完全对应,切换到Columns标签页,手动匹配CSV列和表列(只选你需要的4列即可)。
- 点击OK开始导入,2GB数据需要一定时间,请勿中断连接。
三、备选方案:用psql的\copy命令(更稳定快速)
如果pgAdmin导入卡顿或报错,推荐用psql客户端执行\copy命令,适合大文件:
-- 替换your_table_name为你的表名,路径替换为清理后的CSV绝对路径 \copy your_table_name(title, ingredients, directions, NER) FROM '/路径/清理后_仅指定列.csv' WITH ( FORMAT csv, HEADER true, DELIMITER ',', QUOTE '"', ENCODING 'UTF8' );
内容的提问来源于stack exchange,提问作者Silviu250
相关产品推荐
相关产品推荐

