大型 CSV · 实用指南
大型 CSV 文件的拆分方法
遇到 Excel 无法打开、运行缓慢或不便分享的 CSV,按正确条件拆分后会更容易处理。本文对比 Excel、Power Query、Python 和 LocaCSV,并说明如何安全地按列值拆分数据。
结论:根据拆分条件选择工具
50MiB 以下的 CSV 可以在 LocaCSV 中按列值、指定数据行数或目标文件大小拆分,全部处理都在浏览器内完成,最多输出 100 个文件。
输入超过 50MiB、需要多列组合键或定时自动执行时,本地 Python 会更灵活。直接在 Excel 中打开大型 CSV 后手动复制粘贴,容易受到行数上限、内存和操作错误影响。
大型 CSV 无法打开的常见原因
CSV 虽然是纯文本,但打开它的软件仍有限制。Excel 工作表最多 1,048,576 行,超过后无法放进同一个工作表。即使没有超过,也可能因为列很多、单元格很长、自动识别类型、内存不足或分隔符判断错误而变慢。
- 数据行超过 Excel 工作表上限。
- 软件把文件展开到内存时,设备可用资源不足。
- 分隔符识别错误,使一条记录被拆成异常多的列。
- 直接按逗号或换行切割,破坏引号内逗号、转义引号和单元格内换行。
- UTF-8、GB18030 等源编码与选择值不同,造成乱码或读取失败。
- Excel 自动转换编码、前导零、长数字或看起来像日期的文本。
Excel、Power Query、Python、LocaCSV 对比
合适的方法取决于拆分规则、文件大小、是否重复执行,以及能否维护代码。
| 方法 | 适用场景 | 优点 | 注意事项 |
|---|---|---|---|
| Excel | 较小的 CSV,需要目视确认且只拆分一次 | 界面熟悉,便于检查 | 有 1,048,576 行上限;大型文件较慢,手工操作容易漏行或重复 |
| Power Query | 在 Excel 中复用导入和转换步骤 | 不直接修改源文件,步骤可刷新 | 加载到工作表仍有行数上限;按值输出多个 CSV 需要额外设计 |
| Python | 超过 50MiB、固定行数或大小、定期批处理 | 可细致控制流式读取、命名、校验和自动化 | 需要自行维护运行环境、代码、测试、编码和错误处理 |
| LocaCSV | 快速按值、行数或目标大小拆分 50MiB 以下 CSV | 无需账号或安装,在浏览器中处理并下载 ZIP | 输出最多 100 个;按值拆分时可选 1 列 |
import csv
from pathlib import Path
source = Path("large.csv")
output_dir = Path("split")
output_dir.mkdir(exist_ok=True)
handles = {}
writers = {}
try:
with source.open("r", encoding="utf-8-sig", newline="") as input_file:
reader = csv.DictReader(input_file)
key_column = "department"
for row in reader:
key = row.get(key_column, "") or "(blank)"
if key not in writers:
output = output_dir / f"group-{len(writers) + 1:03d}.csv"
handle = output.open("w", encoding="utf-8-sig", newline="")
writer = csv.DictWriter(handle, fieldnames=reader.fieldnames)
writer.writeheader()
handles[key] = handle
writers[key] = writer
writers[key].writerow(row)
finally:
for handle in handles.values():
handle.close()使用 LocaCSV 拆分的步骤
逗号、双引号、转义引号和单元格内换行会按照 CSV 规则解析。运行前先在预览中确认列对齐,是避免错误最重要的一步。
- 打开 CSV 拆分工具并选择一个 CSV 文件。
- 确认是否有表头、输入编码和分隔符;如果预览中的列错位,请不要继续。
- 选择按列值、行数或目标大小拆分。
- 按值模式设置列与空白值处理;其他模式设置每个文件的数据行数或目标 MiB。
- 确认输出编码、UTF-8 BOM 和输出分隔符后开始拆分。
- 检查输入、输出与排除行数、输出文件数和警告,再下载 ZIP。
按列值拆分的方法
按值拆分会针对某一列中的每个分类建立独立文件,例如门店、部门、客户或月份。如果“门店”列中有北京、上海、深圳,相同值的行会进入同一个 CSV,最终产生三个输出。
表头重复、缺少表头或带有多余空格时,请结合预览和从 1 开始的列号确认目标列。拆分值如果包含 Windows 文件名禁用字符或保留名称,LocaCSV 会转换成可安全使用的文件名。
- 相同值的行会进入同一个输出文件。
- 空白值可以排除或输出到独立文件。
- 每次只能选择一个拆分列。
- 如果唯一值超过 100 个,处理会停止,也不会提供不完整的 ZIP。
- 提供 ZIP 前会校验“输入行数 = 输出行数 + 排除行数”。
行数与文件大小注意事项
CSV 的处理难度并不只由文件大小决定。同样是 50MiB,数百万条短记录与包含超长单元格、引号内换行的文件,所需内存和时间会不同。
LocaCSV Free 的单一输入上限为一个 50MiB 文件。设备性能、浏览器、CSV 结构和输出量可能让更小的文件也难以处理。修改扩展名或直接放入压缩包无法绕过限制。
- 行数模式不计算表头,只计算每个文件中的数据行。
- 目标大小按输出编码后的实际字节数判断,包括 BOM 和每个文件重复的表头。单条记录如果已经超过目标,会保持完整并单独输出。
- 所有模式最多输出 100 个文件。
- 不要覆盖原文件;单独保存 ZIP 并核对行数。
- 如果要用 Excel 打开输出,还要确认每个文件少于 1,048,576 行。
字符编码与乱码处理
中国大陆旧系统导出的 CSV 常见 GBK,新系统更常见 UTF-8 或 GB18030。LocaCSV 可手动选择 GB18030,但没有单独的 GBK 选项。GB18030 与大量 GBK 字节序列兼容,但仍应通过预览检查简体中文、全角标点和特殊字符。
如果标为 GBK 的文件用 GB18030 预览仍不正确,请先用本地工具转成 UTF-8 或 GB18030。输出可选择 UTF-8 带 BOM 或不带 BOM,也可选择 GB18030。目标编码无法表示字符时,LocaCSV 会停止,而不是悄悄替换成“?”。
- 在预览中检查姓名、地址、全角标点、生僻字和货币符号。
- 列错位通常是分隔符问题,请确认逗号、分号、Tab 或竖线。
- 编码不明时,查看源系统的导出设置。
- 不要把乱码结果另存并覆盖原文件,应从原始文件重新操作。
安全性与本地处理
LocaCSV 使用浏览器内的 Web Worker 处理 CSV。CSV 内容、文件名、表头、单元格值和拆分值不会为处理而上传到外部服务器。结果也在浏览器中生成,下载或重置后会释放保留的引用。
公开信息网站使用 Cloudflare Web Analytics 了解页面浏览量。处理网站不加载广告或分析 SDK,只会把功能、容量区间、时间区间、固定错误代码等不含标识符的最小使用事件发送到第一方专用端点。事件不含 CSV 内容、文件名、精确容量或行数,发送失败也不会阻止处理和下载。
处理机密数据时,仍应确认组织规范、设备安全、浏览器扩展和下载文件夹权限。在浏览器中处理并不意味着整台设备自动安全。
大型 CSV 拆分常见问题
Excel 无法打开的 CSV 也能拆分吗?
如果 CSV 不超过 50MiB、可以指定支持的编码与分隔符,并且输出不超过 100 个,就能用 LocaCSV 拆分。即使数据行超过 Excel 工作表上限,CSV 本身仍可读取,但实际处理能力会受设备和文件结构影响。
可以每 10 万行或每 10MB 拆分吗?
可以。行数模式不计算表头;目标大小可设为 0.1~50MiB,并按编码后包含 BOM 与表头的实际字节拆分。单条记录不会被截断,因此可能单独超过目标。
可以处理超过 50MiB 的 CSV 吗?
当前公开的 Free 单一输入工具上限为一个 50MiB 文件,并未宣称支持更大的输入。请先在本地把源文件拆小。
GBK 文件应该怎么处理?
LocaCSV 没有单独的 GBK 选项,可以先手动选择 GB18030 并检查预览。若简体中文或符号不正确,请在本地转换成 UTF-8 或 GB18030 后再使用。
CSV 会上传到服务器吗?
CSV 内容、文件名、表头、单元格值和拆分值不会为处理而上传。拆分和 ZIP 生成都在浏览器中执行。