求助:合并6个单列CSV文件为单表及CSV的最简方法与文件膨胀问题
嘿,我来帮你搞定这两个问题——文件暴增的原因和最简合并方案,都是适合新手的操作步骤!
为什么40MB的文件变成了500MB?
问题出在你创建表时用的char(200)类型!这是固定长度字符类型:不管你的邮箱实际有多长,PostgreSQL都会把每个字段填充到200个字符(不足的部分用空格补齐)。比如一个只有25个字符的邮箱,会被硬塞175个空格,直接导致存储和导出后的CSV体积爆炸。
解决这个问题很简单,换成可变长度类型就行:varchar(200)(适合有长度限制的场景)或者text(无长度限制),它们只会存储邮箱的实际字符数,不会额外填充空格。
最简合并方法(两种可选,挑你顺手的)
方法1:用PostgreSQL一步搞定导入(少开一个窗口)
第一步:重建正确的表结构
先删掉原来的表(如果已经导入了数据),重新创建:
DROP TABLE IF EXISTS email_list; CREATE TABLE email_list (email varchar(200)); -- 或用text,varchar更贴合邮箱长度限制
第二步:一次性导入所有CSV(自动跳过重复表头)
Windows下可以借助系统命令type和findstr来合并文件并跳过重复表头,直接用PostgreSQL的COPY FROM PROGRAM执行:
COPY email_list(email) FROM PROGRAM 'cd /d "E:\WORK" && type FXJohn*.csv | findstr /v "email"' DELIMITER ',' CSV;
解释一下:
cd /d "E:\WORK":切换到CSV所在目录type FXJohn*.csv:合并所有匹配的CSV文件内容findstr /v "email":过滤掉所有包含"email"的行(也就是每个文件的表头,只保留数据行)- 最后用
COPY直接导入过滤后的内容
第三步:导出最终CSV
COPY email_list TO 'E:\WORK\final_merged_emails.csv' DELIMITER ',' CSV HEADER;
方法2:用Windows命令行先合并CSV(新手更直观)
如果觉得SQL里嵌套系统命令有点绕,可以先手动合并CSV再导入:
- 打开命令提示符(CMD),切换到CSV文件所在文件夹:
cd /d E:\WORK
- 执行以下命令,自动合并所有CSV,只保留第一个文件的表头:
@echo off set "first_file_done=no" for %%f in (FXJohn*.csv) do ( if "!first_file_done!"=="no" ( type "%%f" > merged_emails.csv set "first_file_done=yes" ) else ( more +1 "%%f" >> merged_emails.csv ) )
- 回到PostgreSQL,导入合并好的文件:
COPY email_list(email) FROM 'E:\WORK\merged_emails.csv' DELIMITER ',' CSV HEADER;
- 导出最终文件(和方法1的第三步一样)
额外小技巧:去重(如果需要)
如果你的CSV里有重复邮箱,可以在导入后执行这个命令生成无重复的表:
CREATE TABLE unique_email_list AS SELECT DISTINCT email FROM email_list;
然后从unique_email_list导出,文件体积会更小哦!
内容的提问来源于stack exchange,提问作者Laurynas Leskauskas




