将Excel转换为带有UTF8编码的CSV

644
我有一个Excel文件,其中包含一些西班牙语字符(如重音符等),我需要将其转换为CSV文件以用作导入文件。然而,当我选择“另存为CSV”时,它会破坏那些不是ASCII字符的“特殊”西班牙语字符。似乎它也会这样处理左右引号和长破折号,这些符号看起来是源文件的原始用户在Mac上创建的。
由于CSV只是一个文本文件,我相信它可以处理UTF8编码,所以我猜这是Excel的限制,但我正在寻找一种从Excel到CSV的方法,并保持非ASCII字符完整。

15
在我发布这个问题之前,我看到过那个问题,但是那个问题是关于已经有一个UTF8格式的CSV文件并在Excel中打开它,而不是相反的情况。 - Jeff Treuting
8
下面的答案似乎可行,但它们只是权宜之计。有没有人知道如何让Excel实现这个功能? - NielW
3
这是一个非常让人烦恼的Excel限制。我在uservoice上提出了一个功能请求:http://excel.uservoice.com/forums/304921-excel-for-windows-desktop-application/suggestions/10006149-support-saving-csv-in-utf-8-encoding,欢迎投票并实现它。 - Doron Yaacoby
3
在我的语言中,Excel会自动将每个“…”或“oe”或“ae”转换为Unicode等效项(…,œ,æ),但当到导出时,它会惊叫着说:“天哪,这些字符是什么?” 微软,你是认真的吗? - Martin
7
根据Excel用户反馈,微软上个月开始着手将UTF-8编码应用于.csv文件的保存 https://excel.uservoice.com/forums/304921-excel-for-windows-desktop-application/suggestions/10006149-support-saving-csv-in-utf-8-encoding - moloko
显示剩余6条评论
36个回答

422

一个简单的解决方法是使用Google表格。如果你有复杂的公式请粘贴(仅值)或导入该表,然后下载CSV文件。我刚试了几个字符,效果还不错。

注意:在导入时,Google表格存在限制。请参见这里

注意:在使用Google表格时要小心敏感数据。

编辑:另一种选择 - 基本上他们使用VB宏或插件来强制保存为UTF8格式。我没有尝试过这些解决方案,但听起来合理。


69
也许 Joel Slotsky(Excel的前项目经理)可以把他的《关于 Unicode 和字符集,每个软件开发人员绝对必须知道的绝对最低限度》的十年前的帖子(http://www.joelonsoftware.com/articles/Unicode.html)发给他们? - Indolering
9
使用普通的Windows记事本(使用“另存为”,然后在编码选项中选择utf-8)对我而言是可行的。对于没有管理员权限的用户来说,这是最好的方法,因为不需要安装额外的软件。 - Fer
9
OpenOffice可以轻松使用,没有任何麻烦 - 我认为它应该被包括进来。 - Robert Cutajar
10
哎呀,我刚才感到一阵寒意。如果你的Excel文件有200,000行怎么办?或者包含你不想在Excel电子表格中包含的敏感数据怎么办?如果需要的话,请使用Openoffice/Libreoffice。 - Seb
2
如果文件大小很大怎么办?如果我没记错,Google表格的大小限制大约在75M左右。我的文件有700M。 - MLE
显示剩余11条评论

145

我发现OpenOffice的电子表格应用程序“Calc”非常擅长处理CSV数据。

在“另存为...”对话框中,点击“格式选项”以获取CSV的不同编码。据我所知,LibreOffice也是同样的方式。

calc save dialog


我相信这个方法是可行的,只是我没有安装OpenOffice,所以在我的情况下使用Google文档更容易。但还是谢谢你的建议。 - Jeff Treuting
21
OpenOffice Calc在打开和保存“CSV”文件(字段分隔符、编码等)时,拥有更多且更好的选项,比Google Docs和Excel都要优秀。此外,Google Docs目前每个电子表格最多只能容纳400,000个单元格,而OpenOffice Calc没有这个限制。 - Christian Davén
4
我可以确认LibreOffice也可以使用:它在导出时提供了字符编码选项,而这在Excel中令人遗憾地缺失。 - Rupert Rawnsley
1
这对于处理敏感数据的人来说是一个很好的选择。OpenOffice套件可以为那些受限制的机器提供便携式安装。 - Nathan

122
  1. 将Excel表格保存为“Unicode 文本 (.txt)”格式。好消息是,所有国际字符都使用UTF16编码(请注意,不是UTF8)。但是,新的“*.txt”文件是TAB分隔符而不是逗号分隔符,因此它不是真正的CSV。

  2. (可选)除非您可以使用TAB分隔符文件进行导入,否则请使用您喜欢的文本编辑器并将TAB字符替换为逗号“,”。

  3. 在目标应用程序中导入*.txt文件。确保它支持UTF16格式。

如果已经正确实现了UTF-16,并支持非BMP代码点,则可以将UTF-16文件转换为UTF-8而不会丢失信息。我让您自己找到喜欢的方法来完成这个步骤。

我使用这个过程将数据从Excel导入到Moodle。


5
终于有了有效的方法!尝试了上述在 Excel 2013 上的选项但没有成功。当我将\t作为分隔符进行解析时,它完美地工作了! - Mattias Lindberg
1
需要将XLS导出为CSV以便在MySQL中导入。使用Excel 2003,我以“Unicode文本(.txt)”格式导出,然后使用Notepad++将TAB替换为;,最后使用默认的“文件字符集:utf-8”,格式为“使用LOAD DATA的CSV”将txt文件导入phpmyadmin。所有编码都被正确传输。 - Avatar
3
谢谢。这很有道理。为什么微软还拒绝将UTF作为标准,这让我感到困惑。 - Oskar Limka
4
当你说“UTF”时,你是指UTF-8还是UTF-16?因为微软经常使用UTF-16。 - Flimm
9
“好消息是所有国际字符都在UTF16中(注意,不是UTF8)。 ”这完全是无稽之谈。UTF-8和UTF-16是编码整个Unicode代码点集的两种方式。 - user8308466
显示剩余7条评论

46

我知道这是一个旧问题,但我偶然间遇到了这个问题,正在与OP一样苦苦挣扎。

没有找到任何可行的解决方案,我开始探索是否有一种只使用Excel就可以解决的办法。

幸运的是,在我的情况下,丢失字符问题仅在从xlsx格式保存为csv格式时发生。我尝试先将xlsx文件保存为xls,然后再保存为csv。它确实奏效了。

请尝试一下,看看是否适用于您。祝好运。


3
在我的Mac Excel 2011上,只有选择“Windows逗号分隔(CSV)”这个选项才能使此方法奏效。如果我使用默认或DOS CSV选项,它就不起作用-这两个选项都会用随机的垃圾字符替换带重音符号的字符。已测试包括“é”,“è”,“â”等字符。不知道它是否真正采用了UTF8编码,但字符没有乱码。 - user56reinstatemonica8
13
快速确认 - 这种方法生成的文件 (Excel for Mac 2011) 不会 产生UTF-8格式的csv文件,但是 它们生成的CSV文件至少包含正确的字符,因此可以在文本编辑器中轻松转换为UTF8格式,这是相较于 Excel 默认输出的混乱垃圾而言的一大进步。 - user56reinstatemonica8
是的,同意,这对我也起作用了(Excel Mac 2011),它真的值得更多的赞。 - cbmanica
1
这对我来说并不完全有效(使用Excel 2007)。我的文件中有2个非ASCII字符,其中一个以这种方式保存了,而另一个则没有。 - EM0
1
请注意,生成的CSV文件将是UTF-16格式,而不是问题所要求的UTF-8格式。 - Flimm

38
你可以在Unix系统下使用iconv命令(也可在Windows上使用libiconv)。
在Excel中将文件保存为CSV格式后,在命令行输入:
iconv -f cp1250 -t utf-8 file-encoded-cp1250.csv > file-encoded-utf8.csv

请记得将cp1250替换为您的编码。
对于像邮政编码数据库这样无法导入GoogleDocs(400,000单元格限制)的大文件,它运行快速且表现出色。

5
如果你的内容包含无法在1250编码中转换的字符,那么将其导出为“Unicode .txt”文件并使用iconv从Utf16进行转换是更好的方法。也许还需要使用'sed'或'tr'工具将'\t'转换为','。 - Sebastian
5
在将 Excel 文件保存为 CSV 或 MS-DOS CSV 格式时,Excel 的默认编码似乎是 CP858;而在将其保存为 Windows CSV 格式时(在 Mac 上测试的 Excel for Mac 2011 版本中),默认编码则为 Windows 1252。 - claymation
4
我完全同意这一点,因为当Excel以.csv格式保存时,它会丢失那些无法在每个代码点使用一个字节进行编码的Unicode代码点的信息。 - Flimm

36
您可以在现代Windows机器上完成此操作,无需第三方软件。这种方法可靠,并且可以处理包括带引号的逗号、带引号的制表符、CJK字符等数据。
1. 从Excel保存
在Excel中,使用类型“Unicode文本(*.txt)”将数据保存到“file.txt”。
2. 启动PowerShell
从开始菜单中运行“powershell”。
3. 在PowerShell中加载文件
$data = Import-Csv C:\path\to\file.txt -Delimiter "`t" -Encoding BigEndianUnicode

4. 将数据保存为CSV格式

$data | Export-Csv file.csv -Encoding UTF8 -NoTypeInformation

3
这种方法对于一个包含超过15,000条记录的CSV文件非常有效,其中每一行都超过了Notepad所限制的1024个字符的限制。 它只需要几秒钟的时间,而且不需要使用第三方软件。谢谢! - absolute
啊,即使我尝试使用Google表格,我也遇到了同样的问题。因此,这个PowerShell策略可能会起作用。这是我的问题。对于某些字符,例如某些表情符号,您需要使用CHARACTER SET utf8mb4,如此处所述:https://dev59.com/qGgu5IYBdhLWcg3w8bhs#10959780。 - Ryan
1
@Ryan 那个问题是特定于MySQL的。我刚刚尝试了那个问题中的有问题字符,在Excel和PowerShell中都可以正常工作。 - Don Cruickshank
运行得非常好!还可以直接将两个命令管道在一起:Import-Csv ... | Export-Csv ...,而不使用中间的 $data 变量。 - Sjlver

26
唯一的“简单方法”是如下操作。首先,意识到在 Excel .csv 文件中,所显示和隐藏的内容是不同的。
  1. 打开一个包含信息的 Excel 文件(.xls、.xlsx)
  2. 在 Excel 中,选择“CSV(逗号分隔)(*.csv)”作为文件类型,并保存为该类型。
  3. 在记事本中(在“程序”下的“开始”菜单 Accessories 中找到),打开保存的 .csv 文件。
  4. 然后选择 -> 另存为...,在“另存为”框的底部,有一个标记为“编码”的下拉列表。选择 UTF-8(不要使用 ANSI,否则会失去所有重音等)。选择 UTF-8 后,将文件保存为与原始文件名称略有不同的文件名。

这个文件以 UTF-8 格式编码,保留了所有字符和重音符号,可以导入到 MySQL 和其他数据库程序中。

本答案摘自此论坛


10
这是不正确的,因为步骤2保存为CSV。问题在于Excel将CSV文件保存在cp1252编码中,这是一种每个代码点一个字节的编码方式。这会导致无法适应一个字节的字符信息丢失。 - Flimm
它对我起作用了,但我不明白为什么。我的JavaScript生成的文件在Excel中总是被错误地读取(作为不同的编码)。但是当我在记事本中打开并保存为UTF-8时,它就可以正常工作了!因此,看起来有一个带有编码的元数据。它是如何工作的?如果记事本可以保存UTF-8 CSV文件并且Excel可以读取它们,那么在我的程序中生成正确的UTF-8 CSV文件,Excel可以读取吗? - felipeaf
对我来说很有效。在从Access转换的XSLX中。变音符号、仅限LF和ISO日期格式都可以。其中一种或另一种方法在更流行的解决方案中无法使用。 - RolfBly

22

这是我发现很有用的另一个功能: "Numbers" 允许在保存为 CSV 时进行编码设置。


8
这是一个Mac OSX上的应用程序。 - Sruit A.Suk
请注意数字的限制,因为它在行数方面有限制,我以前转换过类似的数据,但没有意识到它已经裁剪了一些数据。Excel/CSV具有更高的限制。 - MrE

16

使用Notepad++

这将修复被Excel保存并以正确编码重新保存的已损坏的CSV文件。

  • 从Excel导出CSV
  • 加载到Notepad++中
  • 修复编码
  • 保存

Excel保存为CP-1252 / Windows-1252。在Notepad ++中打开CSV文件。选择

Encoding > Character Sets > Western European > Windows-1252

那么

Encoding > Convert to UTF-8
File > Save

首先告诉Notepad++编码,然后转换。其他一些答案在没有设置正确的编码的情况下进行转换,会进一步破坏文件。它们将把应该是'的内容变成。如果您的字符无法适应CP-1252,则在保存为CSV时已经丢失。对此,请使用另一个答案。


我可能理解有误,但是你不能在Notepad++中将文件保存为“.csv”格式,这就是问题所在。 - Daniel Maurer
1
可以的。你只是在保存一个文本文件,而 .csv 就是一个文本文件。这个答案将打开被 Excel 损坏的 CSV 文件,修复它,然后用正确的编码重新保存它。 - Chloe
你所传达的信息具有深远的影响。采用这种卓越的方法,我们可以获得更高的数据质量!太棒了!(问题:为什么这个评论如此疑问?) - thymaro

14

"nevets1219"关于Google文档的说法是正确的,但是如果你只是简单地“导入”文件,它通常不会将其转换为UTF-8。

但是,如果您将CSV文件导入到现有的Google电子表格中,它将会被转换为UTF-8。

以下是操作步骤:

  • 在主要的Docs(或Drive)屏幕上,点击“创建”按钮,选择“电子表格”
  • 从“文件”菜单中选择“导入”
  • 点击“选择文件”
  • 选择“替换电子表格”
  • 选择您正在使用作为分隔符的任何字符
  • 点击“导入”
  • 从“文件”菜单中选择“下载为”-> CSV(当前工作表)

生成的文件将是UTF-8编码的


2
这个答案的问题在于你最开始是如何生成CSV文件的。如果你是通过在Excel中简单地保存为CSV来实现的,那么CSV文件将会采用cp1252编码,这是一种每个码点一个字节的编码方式。当涉及到无法适应一个字节的字符时,这将导致信息的丢失。 - Flimm
这是任何答案都存在的问题。而且,由于无法知道或控制原始编码方式,因此任何关于如何转换为UTF-8的答案都会存在这个问题。 - RedYeti
1
一些答案确实谈到了如何解决这个问题,例如,https://dev59.com/4m855IYBdhLWcg3wpmHw#15500052。 - Flimm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接