我有一个包含 9273 行的 .csv 文件。
我有一列整数和一列十进制数,其值为 0.0001752。
我使用 Excel 的求和函数计算了这些列的总和,得到了总计 8904671 和 4750.04556。
然后,我使用“LOAD DATA INFILE”将此 .csv 文件导入 MySQL 数据库。该数据库还包含 9273 行数据,但 MySQL SUM 函数返回的列总数为 8603588 和 4432.1793865700。
我很困惑,于是我用 LibreOffice 打开了原始 .csv 文件,并再次计算了各列的总数。结果显示各列的总数为 8603597.8662(整数)和 4432.17938657。
最后,我想看看 Google Sheets 如何处理 .csv 中的数据。如果数据是从 LibreOffice 复制的,它会将列总计为 LibreOffice 值;如果数据是从 Excel 复制的,它会将列总计为 Excel 值。如果我导入纯 .csv,Sheets 还会给出 Excel 总计。但是,除非我选择“将文本转换为数字、日期和公式”选项的“是”,否则 Sheets 根本无法将列总计。
总而言之,对于同一个 .csv,两列的总数为:
MySQL: 8603588, 4432.1793865700
Excel: 8904671, 4750.04556
LibreOffice: 8603597.8662, 4432.17938657
Google Sheets from Excel: 8904671, 4750.045587
Google Sheets from Libre: 8603597.866, 4432.179387
Google Sheets from .csv: 8904671, 4750.04556
(Google 表格需要“将文本转换为数字”选项)
哪一组是正确的列总数,为什么相同值的总和会得出不同的总数?
答案1
我找到了问题所在。我的描述中缺少了一件实际上很重要的事情 - .csv 在两列整数之前包含一些带有字符串值的列。
大多数 .csv 行看起来像这样......
- “某个字符串”、“另一个字符串”、“84711”、“1.41128526”
然而,我最终找到了如下这样的一行......
- “某些字符串”,“另一个字符串”,“35091”,“37.82739618”
Excel 正确读取了上面两行,均为 4 列。
但是,LibreOffice 仅将其读取为 3 列,并将“Some-“String””,“Another String”视为一列而不是两列。
令我惊讶的是,在第一个字符串包含双引号的情况下,LibreOffice 和 MySQL 的“LOAD DATA INFILE”均未将逗号视为新列的分隔符,而 Excel 却这样做了。这也解释了为什么在 Libre 和 MySQL 中,原本应该只包含整数的列最终变成了十进制数,因为值列都向左移动了一列。