跳到工具
ViewCSV
无需上传文件

合并 CSV 文件:上下拼接行或按列关联

2 个文件
  1. customers.csv8 行 · customer_id, name, country, segment
  2. invoices.csv10 行 · customer_id, invoice_no, total, paid
合并方式
结果
结果
#customer_idnamecountrysegmentinvoice_nototalpaid
100301静 陈中国business···
200302敏 李中国education···
300303涛 李中国business···
400304磊 吴中国business···
500305芳 黄中国retail···
600306艳 杨中国retail···
700307艳 孙中国business···
800308静 刘中国business···
900308···INV-2400855.16false
1000307···INV-2401862.27true
1100309···INV-2402817.14false
1200309···INV-2403797.76false
1300304···INV-2404413.26true
1400309···INV-2405854.71true
1500302···INV-2406369.69true
1600301···INV-2407602.17true
1700307···INV-2408762.70true
1800306···INV-2409863.77true

18 行 · 7 列

要合并 CSV 文件,添加两个或更多文件,再选择合并方式。“上下拼接行”把所有文件的行依次叠成一张表,并按列名对齐,因此只有部分文件才有的列也会保留,其他文件对应的位置留空;合并每月或各地区的导出文件,通常指的就是这种方式。“按关键列关联”按一个或多个关键列把两个文件左右拼接,作用类似电子表格中的 VLOOKUP 查找,并告诉你匹配了多少行、哪些关键值重复、因此多出了多少行。调整选项时,合并后的表格会实时更新;文件在你的浏览器中合并,不会上传。

如何合并 CSV 文件

  1. 添加文件。每个文件都会自动识别分隔符和编码,并把第一行当作表头。列表中会显示每个文件的行数和前几列;上下移动文件即可调整顺序。
  2. 选择“上下拼接行”,把各文件的行一个接一个排在一起;或选择“按关键列关联”,按关键列匹配前两个文件中的行。
  3. 检查预览及其上方的提示,然后把结果下载为 CSV,或在 CSV 编辑器 中打开继续处理。

行的顺序与文件列表一致:先是第一个文件的所有行,再是第二个文件的所有行,依此类推。如果要合并很多份月度导出,可以一次全部添加,并开启来源列,这样每一行都能看出来自哪个文件。

上下拼接:合并列不同的文件

上下拼接有三种列对齐方式,请根据文件之间的差异选择。

按列名对齐(保留所有列,默认)结果包含所有文件中的所有表头,按首次出现的顺序排列。如果某个文件缺少某列,它的行在该列为空。列名必须完全相同:SKU 和 sku 会成为两列。
要求列完全相同只要有文件的表头在名称、数量或顺序上不同,就报错停止,并指出第一个不一致的文件。适合所有文件都应来自同一种导出的情况:某列被改名,就说明出了问题。
按位置对齐第 1 列对第 1 列,依此类推。表头取自列数最多的文件;列数较少的文件在末尾补空值。只有在文件没有可用的表头,或布局相同但列名不同时才使用。
添加一列记录每行的来源文件名在最后添加一列,默认名为 source_file(可以修改),记录每一行所属的文件名。这个名称不能与已有表头相同。
删除完全重复的行拼接完成后,删除与前面某行完全相同的行,并报告删除了多少行。保留第一次出现的那一行。各值必须完全相同,包括大小写和空格;比较时忽略来源列,所以两个文件中的同一行也算重复。

如果某个文件多出一列或列顺序不同,按位置对齐会把值放到错误的表头下:在下面的示例中,四月文件的 qty 就会落到 name 下面。只要文件有表头,按列名对齐就能避免这个问题。

关联:按关键列合并两个文件

关联使用列表中的前两个文件,分别作为左表和右表。选择一对或多对关键列;每对的列名可以不同,例如左表的 customer_id 对应右表的 id。有多对关键列时,只有每一对都匹配,这一行才算匹配。

左连接(第一个文件的所有行,默认)保留左表的每一行;关键值匹配时填入右表的列,不匹配时留空。
内连接(仅两个文件都有的行)只保留关键值能在右表中找到的左表行。
右连接(第二个文件的所有行)保留右表的每一行:匹配的行按左表顺序排列,之后是没有匹配的右表行。
全连接(两个文件的所有行)保留两个文件的所有行:先是左连接的结果,再是没有匹配的右表行。
关键列忽略大小写和首尾空格 C02 能与 c02 匹配。写入结果的是左表中的关键值文本。

结果先包含左表的所有列,再包含右表中除关键列以外的列。如果右表的某个列名已被使用,会加上 (2),例如 total (2),提示中会列出被重命名的列。对于没有匹配的右表行,其关键值写入左表的关键列,其他左表列留空。

如果某个关键值在右表中出现多次,每个匹配的左表行都会按匹配次数重复。提示会统计匹配的行、仅在左表的行、仅在右表的行、两边各自重复的关键值,以及因此多出的行数;本该一对一的查找如果并非一对一,一眼就能看出来。

值、表头和不同的分隔符

  • 所有值都是文本,并按原样保留,所以 00123 保留前导零。关键值也按文本比较:即使忽略大小写和空格,00123 和 123 也不匹配。
  • 值内被引号括起的分隔符、引号和换行按 RFC 4180 读取,下载时在需要处重新加上引号。
  • 在同一个文件内,空白表头会变成 Column 3,重复表头变成 name (2)。这些生成的名称和其他列名一样参与按列名对齐。
  • 各文件可以使用不同的分隔符和编码,每个文件分别识别。下载的文件以逗号分隔,换行符和编码与列表中的第一个文件一致。浏览器无法写出的编码(例如 Shift_JIS、GB18030)会保存为 UTF-8。

拼接与关联时的常见问题

  • 同一列出现了两次,名称略有不同。各文件中的表头拼写不一致(Email 和 email,或末尾多了空格)。合并前用 重命名和调整 CSV 列顺序 统一其中一个的列名;如果布局完全相同,也可以改用按位置对齐。
  • 关联几乎没有匹配上。检查两个文件中关键值的写法是否一致:前导零、前缀和空格都会影响匹配。开启忽略大小写和首尾空格,或先用 清洗 CSV 数据 去除该列的首尾空格。
  • 关联结果的行数比左表多。右表中有重复的关键值;提示会显示有多少个关键值重复、因此多出了多少行。请删除重复项,或选择更精确的关键列配对。
  • 合并后的表格超出了浏览器限制。结果最多 10 万行、200 万个单元格。请先 筛选 输入文件,或每次少合并几个文件。

合并的限制与隐私

每个文件最大 25 MB、10 万行、250 列和 200 万个单元格,拼接或关联后的结果同样限制在 10 万行和 200 万个单元格以内。合并不采用流式处理:所有文件都会载入内存。

文件在当前标签页的后台线程中读取,并在你的浏览器中合并,不会发送到任何服务器。如果要找出同一文件两个版本之间的差异,而不是把它们合在一起,请使用 对比 CSV 文件;要把一个文件拆成几份,请使用 拆分 CSV 文件。

示例:上下拼接两份列不同的库存文件

两份列不同的库存导出,按列名上下拼接,并开启来源列。name 和 warehouse 只存在于其中一个文件,所以另一个文件的行在这两列为空;SKU 保留了前导零。

CSV
march.csv
sku,name,qty
00123,"Desk lamp, brass",4
00456,Shelf,2

april.csv
sku,qty,warehouse
00789,10,North
00456,2,
merged.csv
sku,name,qty,warehouse,source_file
00123,"Desk lamp, brass",4,,march.csv
00456,Shelf,2,,march.csv
00789,,10,North,april.csv
00456,,2,,april.csv

常见问题

能关联两个以上的文件吗?

一步做不到。关联只使用列表中的前两个文件。请下载或打开结果,再与下一个文件关联。上下拼接没有这个限制,添加多少个文件就拼接多少个。

删除重复行只比较关键列吗?

不是。只有每个值都与前面某一行完全相同时,这一行才会被删除。如果要每个 ID 只保留一行,请把结果放到 清洗 CSV 数据 中,按关键列删除重复行。

为什么按位置对齐把值放到了错误的表头下?

按位置对齐会忽略列名,并采用列数最多的文件的表头。如果某个文件有其他文件没有的列,后面的值都会错位。请改用按列名对齐。

标准与参考资料