You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

求助:合并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下可以借助系统命令typefindstr来合并文件并跳过重复表头,直接用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再导入:

  1. 打开命令提示符(CMD),切换到CSV文件所在文件夹:
cd /d E:\WORK
  1. 执行以下命令,自动合并所有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
    )
)
  1. 回到PostgreSQL,导入合并好的文件:
COPY email_list(email) FROM 'E:\WORK\merged_emails.csv' DELIMITER ',' CSV HEADER;
  1. 导出最终文件(和方法1的第三步一样)
额外小技巧:去重(如果需要)

如果你的CSV里有重复邮箱,可以在导入后执行这个命令生成无重复的表:

CREATE TABLE unique_email_list AS SELECT DISTINCT email FROM email_list;

然后从unique_email_list导出,文件体积会更小哦!

内容的提问来源于stack exchange,提问作者Laurynas Leskauskas

火山引擎 最新活动