跳到主要内容
PulsarKit

CSV、Excel和JSON的区别:用一张10,000行的表格实测

我们用六个转换工具,让同一张10,000行的表格在CSV、Excel和JSON之间来回转换。下面是文件大小、打包成ZIP后的大小、用时,以及每一个转回来后变了样的单元格。

作者:PulsarKit ·

简短回答

对于一张平面表格,CSV生成的文本文件最小:我们这10,000行是1.2 MB。同样的行存成带缩进的JSON是2.7 MB,存成NDJSON是2 MB。打包成ZIP后,CSV和JSON相差不大:357 KB,对比398到424 KB。

更大的差别出现在转回来的路上。用默认设置经Excel或经JSON往返一次,100,000个单元格中都有10,960个变了,而且变的不是同一批。有一个设置能让经Excel的往返分毫不差。只有JSON保留了嵌套字段:它们一旦经过CSV或电子表格,就再也回不来了。所以,选哪种格式,要看接下来读这个文件的是什么。

我们怎么测的

2026年10月21日,我们用脚本生成了一张测试表格:10,000行、10列,数据都是虚构的。里面有带前导零的编号,比如000001,还有13位条形码和19位账号。还有ISO格式的日期,以及带两位小数的金额,其中约一半是负数。姓名混用拉丁字母、带重音的字母和西里尔字母,每一百行里有一行带一个表情符号。每一百条备注里有一条包含逗号、引号和换行。优惠券这一列有3,096行是空的,每个电话号码都以加号开头。

我们在pulsarkit.com上用六个转换工具处理它:CSV转Excel、Excel转CSV、CSV转JSON、JSON转CSV、Excel转JSON和JSON转Excel。用的是2023款MacBook上的Chrome 155。六个工具都在浏览器标签页里运行,除非特别说明,设置都保持默认。计时从点击按钮开始,到“下载”按钮可以点击为止。然后,我们自己的脚本把转回来的每个单元格和原始数据逐一比对,我们还读取了每个工作簿里的单元格类型。打包成ZIP后的大小来自标准ZIP,用Deflate压缩,级别为6。

文件大小、打包后的大小和速度

CSV只在开头写一次列名,JSON则在每条记录里重复一遍。用默认的两个空格缩进,CSV转JSON把这张表格变成了2.7 MB,是CSV的2.3倍。NDJSON每行一条紧凑的记录,是2 MB。把“JSON格式化”设为“压缩”,带缩进的文件也变成了同样的2 MB,小了23.6%。

打包成ZIP能消除大部分差距,因为重复的键正是压缩最擅长处理的东西。打包后,CSV是357 KB,NDJSON是398 KB,带缩进的JSON是424 KB。

XLSX文件本身就是一个ZIP,所以它的大小取决于写出它的程序。CSV转Excel生成的工作表用LibreOffice Calc重新保存后,只有753 KB。如果只在乎大小,就发打包成ZIP的CSV。

速度没有拉开格式之间的差距。我们计时了60次转换,转换这10,000行用时的中位数约为三分之一秒,其中49次不到半秒。最慢的一次是我们这轮测试中的第一次Excel转CSV,用了2秒。

往返一次改变了什么

经Excel:先CSV转Excel,再Excel转CSV。前导零、19位账号、条形码、备注里的换行、表情符号和空单元格,都原样回来了。有两列变了。每个true和false都变成了TRUE和FALSE,因为工作簿把它们存成逻辑值。还有960个金额丢掉了末尾的零,612.40变成了612.4:工作簿保存的是数值,而不是它原来的写法。

经JSON:先CSV转JSON,再JSON转CSV。同样那960个金额丢掉了末尾的零,原因相同。每个电话号码回来时前面都多了一个撇号,变成'+1 202 555 0117。JSON转CSV会在任何以+、=、-或@开头、又不是普通数字的值前面加一个撇号,这样电子表格就不会把它当成公式来执行。在JSON里,空单元格变成了空字符串,而Excel转JSON给同样的3,096个单元格写的是null。你得到的JSON取决于走哪条路,除非在CSV转JSON里把“空单元格变为”设为“null”。

在时区设为UTC或UTC+4的浏览器里,每个日期经过CSV转Excel都没有变。CSV转Excel把每个日期写成UTC的午夜,所以时区设为纽约时间的浏览器也不会挪动它。

有一个设置能消除经Excel路线上的所有变化:在CSV转Excel里把“单元格类型”设为“全部作为文本”。这样,无论在纽约时间还是UTC+4下,往返一次后,全部100,000个单元格都和原来写的一模一样。代价是整张表都是文本单元格,金额也一样。文本也适合条形码。用默认设置时,我们的13位条形码变成了“常规”格式的数字。Microsoft的文档说,“常规”格式会用科学记数法显示12位或更多位的数字。

嵌套数据回不来

真实的JSON很少是平面的,所以我们给每条记录加了一个address对象和一个标签列表,带缩进是3.8 MB。JSON转CSV把address展开成名为address.city和address.zip的列,把标签合并到一个单元格里,比如new, wholesale。JSON转Excel也是这样。

再转回JSON时,两个文件都没能恢复原来的结构:都得到了address.city这样的平面键,tags也成了一个字符串,而不是列表。经CSV的路线还改变了类型:10,000个邮政编码中,有6,017个没有前导零,比如78701,回来时变成了数字,而02134仍是文本。在这条路线上,空着的优惠券在我们的文件里是null,回来时成了空字符串。经Excel的路线则让每个邮政编码保持为文本,每个null仍是null。

该选哪种格式

如果要由人来排序、筛选和汇总数据,选XLSX。它把金额保存为数字,日期保存为日期,true和false保存为逻辑值。如果读文件的是程序,选JSON。它保留数字、true、false和null,也是三者中唯一能容纳嵌套字段的格式。NDJSON和用“压缩”去掉缩进的JSON一样大,每行放一条记录。

如果文件只是在系统之间传递,打包成ZIP的CSV是三者中最小的。不过,分隔符、编码和字节顺序标记仍可能让CSV在导入Excel时出问题。我们的指南《CSV转Excel再转回来,怎样不弄坏数据》讲的就是这些。

本文用到的工具

继续阅读