代码之家  ›  专栏  ›  技术社区  ›  Jeff Treuting Charlie Martin

使用UTF8编码的Excel到CSV

  •  561
  • Jeff Treuting Charlie Martin  · 技术社区  · 14 年前

    我有一个Excel文件,其中包含一些西班牙语字符(tildes等),我需要将其转换为CSV文件以用作导入文件。但是,当我保存为CSV时,它会损坏不是ASCII字符的“特殊”西班牙语字符。它似乎还可以使用左右引号和长破折号来完成此操作,这些引号和长破折号似乎来自在Mac中创建Excel文件的原始用户。

    由于CSV只是一个文本文件,我确信它可以处理UTF8编码,所以我猜它是Excel的一个限制,但是我正在寻找一种从Excel到CSV并保持非ASCII字符完整的方法。

    36 回复  |  直到 8 年前
        1
  •  398
  •   nevets1219    7 年前

    一个简单的解决方法是使用谷歌电子表格。粘贴(只有在有复杂公式时才有值)或导入工作表,然后下载CSV。我试了几个角色,效果很好。

    注意:Google Sheets在导入时确实有限制。见 here .

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

    编辑: Another alternative -基本上他们使用VB宏或加载项来强制保存为UTF8。我没有尝试过这些解决方案,但听起来很合理。

        2
  •  127
  •   aendra    8 年前

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

    在“另存为…”对话框中,单击“格式选项”以获取CSV的不同编码。 LibreOffice 工作方式一样。

    calc save dialog

        3
  •  115
  •   Flimm Hortitude    8 年前
    1. 将Excel工作表另存为“Unicode文本(.txt)”。好消息是所有的国际字符都是UTF16(注意,不是UTF8)。但是,新的“*.txt”文件是制表符分隔的,而不是逗号分隔的,因此不是真正的CSV。

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

    3. 在目标应用程序中导入*.txt文件。确保它可以接受UTF16格式。

    如果在支持非BMP代码点的情况下正确实现了UTF-16,则可以将UTF-16文件转换为UTF-8而不会丢失信息。我让你自己去找你最喜欢的方法。

    我使用此过程将数据从Excel导入Moodle。

        4
  •  42
  •   Eric    12 年前

    我知道这是一个老问题,但我碰巧遇到这个问题,同时与操作相同的问题斗争。

    由于没有找到任何提供的解决方案是可行的,我开始探索是否有一种方法可以仅使用Excel来实现这一点。

    幸运的是,我发现丢失字符问题只在从xlsx格式保存到csv格式时发生(在我的情况下)。我尝试先将xlsx文件保存到xls,然后保存到csv。它确实起作用了。

    请试一试,看看是否适合你。祝你好运。

        5
  •  36
  •   pmilewski    12 年前

    你可以用 iconv Unix下的命令(在Windows上也可用 libiconv ).

    在命令行的Excel下保存为CSV后,输入:

    iconv -f cp1250 -t utf-8 file-encoded-cp1250.csv > file-encoded-utf8.csv
    

    (记住用编码替换cp1250)。

    对于像post codes数据库这样的大文件来说,它的工作速度很快,而且非常好,因为它不能导入到GoogleDocs(限制为400.000个单元格)。

        6
  •  25
  •   phuclv    5 年前

    做这件事的唯一“简单方法”如下。首先,要意识到显示的内容和保存在Excel.csv文件中的内容是有区别的。

    1. 打开包含信息的Excel文件(.xls,.xlsx)
    2. 在Excel中,选择“CSV(逗号分隔)文件类型(*.CSV)并另存为该类型。
    3. 在记事本中(在“程序”下,然后在“开始”菜单中的“附件”下),打开记事本中保存的.csv文件
    4. 然后选择->另存为。。。在“另存为”框的底部,有一个标记为“编码”的选择框。选择UTF-8(不要使用ANSI,否则会丢失所有重音等)。选择UTF-8后,将文件保存为与原始文件稍有不同的文件名。

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

    这个答案取自 this forum .

        7
  •  23
  •   Don Cruickshank    8 年前

    您可以在没有第三方软件的现代Windows机器上执行此操作。这种方法是可靠的,它将处理包括带引号的逗号、带引号的制表符、CJK字符等数据。

    一。从Excel保存

    在Excel中,将数据保存到 file.txt 使用类型 Unicode Text (*.txt) .

    2。启动PowerShell

    跑步 powershell 从开始菜单。

    三。在PowerShell中加载文件

    $data = Import-Csv C:\path\to\file.txt -Delimiter "`t" -Encoding BigEndianUnicode
    

    四。将数据保存为CSV

    $data | Export-Csv file.csv -Encoding UTF8 -NoTypeInformation
    
        8
  •  21
  •   leander    13 年前

    另一个我发现有用的: " 数字 “保存为CSV时允许编码设置。

        9
  •  14
  •   RedYeti    12 年前

    “nevets1219”对Google docs来说是正确的,但是如果你只是“导入”文件,它通常不会将其转换为UTF-8。

    但是,如果将CSV导入到现有的谷歌电子表格中,它就转换为UTF-8。

    这里有一个食谱:

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

    生成的文件将是UTF-8格式的

        10
  •  11
  •   Chloe    6 年前

    使用记事本++

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

    • 从Excel导出CSV
    • 载入记事本++
    • 固定编码
    • 保存

    Excel保存在CP-1252/Windows-1252中。在记事本++中打开CSV文件。选择

    Encoding > Character Sets > Western European > Windows-1252
    

    那么

    Encoding > Convert to UTF-8
    File > Save
    

    首先告诉记事本++编码, 然后 转换。其中一些其他的答案在转换时没有先设置正确的编码,从而使文件更加混乱。他们会改变一切 ’ 进入之内 達 . 如果您的字符不适合CP-1252,则在保存为CSV时它已经丢失。用另一个答案。

        11
  •  8
  •   Flimm Hortitude    8 年前

    对于那些寻找完全编程(或者至少是服务器端)解决方案的人来说,我使用catdoc的xls2cv工具取得了巨大的成功。

    安装catdoc:

    apt-get install catdoc
    

    进行转换:

    xls2csv -d utf-8 file.xls > file-utf-8.csv 
    

    这太快了。

    请注意,包含 -d utf-8 标记,否则将在默认情况下对输出进行编码 cp1252 编码,你就有失去信息的风险。

    请注意 xls2csv 也只适用于 .xls 文件,它不能与 .xlsx 文件夹。

        12
  •  7
  •   Michael Schau    10 年前

    使用Powershell怎么样。

    Get-Content 'C:\my.csv' | Out-File 'C:\my_utf8.csv' -Encoding UTF8
    
        13
  •  7
  •   fantabolous    5 年前

    在Excel 2016及以上版本(包括Office 365)中,有一个专门用于UTF-8格式的CSV选项。

    在Office 365中,请另存为;以前可能选择了CSV(逗号分隔),现在可以另存为的文件类型之一是 CSV UTF-8(逗号分隔)(*.CSV)

        14
  •  6
  •   Randomize    5 年前

    最简单的方法: 无需打开office和google文档

    1. 将文件另存为“Unicode文本文件”;
    2. 现在您有了一个unicode文本文件
    3. 用“记事本”打开,选择“utf-8”或“另存为” 您想要的其他代码页
    4. 将文件扩展名从“txt”重命名为“csv”。这将产生一个以制表符分隔的UTF-8csv文件。
    5. 如果你想 逗号 -分隔文件,打开 csv 文件您刚刚重命名和替换所有标签与逗号。要在Win 10的记事本中执行此操作,只需选择一个选项卡字段,然后单击 Ctrl+H . 在打开的窗口中,键入逗号 , 在“替换为”字段中,然后单击“全部替换”。保存文件。结果将是一个逗号分隔的UTF-8csv文件。

    无论如何不要打开它与微软办公室!!! 现在您有了一个制表符分隔的CSV文件。 或者,如果应用步骤5,则使用逗号分隔。

        15
  •  5
  •   oscaroscar    10 年前

    尽管看起来很有趣,但我发现将180MB电子表格保存到UTF8 CSV文件中最简单的方法是选择单元格并将其复制到Excel中,然后将剪贴板的内容粘贴到SubmiteText中。

        16
  •  3
  •   anroy    13 年前

    我在Mac Excel上找不到解决此问题的VBA解决方案。似乎没有办法输出UTF-8文本。

    所以我最终不得不放弃VBA,咬紧牙关,学习AppleScript。并没有我想象的那么糟。

    解决方案描述如下: http://talesoftech.blogspot.com/2011/05/excel-on-mac-goodbye-vba-hello.html

        17
  •  3
  •   spring_chicken    12 年前

    假设是一个Windows环境,像往常一样在Excel中保存和使用这个文件,然后在Gnome Gnumeric(free)中打开保存的Excel文件。将Gnome Gnumeric的电子表格保存为CSV,对我来说,它保存为UTF-8csv。

        18
  •  3
  •   user35443    12 年前

    简单的方法:下载open office( here ),加载电子表格并打开excel文件( .xls .xlsx ). 然后将其保存为文本CSV文件,并打开一个窗口,要求保留当前格式或保存为.ODF格式。选择“keep the current format”(保持当前格式),然后在新窗口中根据文件所用的语言选择更适合您的选项。西班牙语选择西欧( Windows-1252/ WinLatin 1 )文件也很好用。如果选择Unicode( UTF-8 ),它不适用于西班牙语字符。

        19
  •  3
  •   Mena    11 年前
    1. 将xls文件(Excel文件)另存为Unicode文本=>文件将以文本格式(.txt)保存

    2. 将格式从.txt更改为.csv(将文件从XYX.txt重命名为XYX.csv

        20
  •  3
  •   BSMP ashleighj    7 年前

    我也遇到过同样的问题,但有一个简单的解决办法。

    1. 在Excel 2016或更高版本中打开xlsx文件。
    2. 在“另存为”中选择此选项:“(CSV UTF-8(逗号分隔)*.CSV)”

    它工作得很好,生成了一个csv文件,可以导入到任何软件中。我在SQLITE数据库中导入了这个csv文件,它可以完美地处理所有unicode字符。

        21
  •  2
  •   Silent Sojourner    9 年前

    遇到同样的问题,就用谷歌搜索出了这篇文章。以上都不适合我。最后我把Unicode.xls转换成了.xml(选择另存为。。。它生成了正确的字符。然后我编写代码来解析xml并提取内容供我使用。

        22
  •  2
  •   Scarabee    7 年前

    我已经编写了一个小的Python脚本,可以用UTF-8导出工作表。

    只需提供Excel文件作为第一个参数,后跟要导出的图纸。如果不提供工作表,脚本将导出Excel文件中的所有工作表。

    #!/usr/bin/env python
    
    # export data sheets from xlsx to csv
    
    from openpyxl import load_workbook
    import csv
    from os import sys
    
    reload(sys)
    sys.setdefaultencoding('utf-8')
    
    def get_all_sheets(excel_file):
        sheets = []
        workbook = load_workbook(excel_file,use_iterators=True,data_only=True)
        all_worksheets = workbook.get_sheet_names()
        for worksheet_name in all_worksheets:
            sheets.append(worksheet_name)
        return sheets
    
    def csv_from_excel(excel_file, sheets):
        workbook = load_workbook(excel_file,use_iterators=True,data_only=True)
        for worksheet_name in sheets:
            print("Export " + worksheet_name + " ...")
    
            try:
                worksheet = workbook.get_sheet_by_name(worksheet_name)
            except KeyError:
                print("Could not find " + worksheet_name)
                sys.exit(1)
    
            your_csv_file = open(''.join([worksheet_name,'.csv']), 'wb')
            wr = csv.writer(your_csv_file, quoting=csv.QUOTE_ALL)
            for row in worksheet.iter_rows():
                lrow = []
                for cell in row:
                    lrow.append(cell.value)
                wr.writerow(lrow)
            print(" ... done")
        your_csv_file.close()
    
    if not 2 <= len(sys.argv) <= 3:
        print("Call with " + sys.argv[0] + " <xlxs file> [comma separated list of sheets to export]")
        sys.exit(1)
    else:
        sheets = []
        if len(sys.argv) == 3:
            sheets = list(sys.argv[2].split(','))
        else:
            sheets = get_all_sheets(sys.argv[1])
        assert(sheets != None and len(sheets) > 0)
        csv_from_excel(sys.argv[1], sheets)
    
        23
  •  2
  •   Jason Williams    7 年前

    Excel通常将csv文件保存为ANSI编码,而不是utf8。

    更正文件的一个选项是使用记事本或记事本++:

    1. 使用记事本或记事本++打开.csv。
    2. 将内容复制到计算机剪贴板。
    3. 从文件中删除内容。
    4. 将文件的编码更改为utf8。
    5. 将内容从剪贴板中粘贴回。
    6. 保存文件。
        24
  •  1
  •   SequenceDigitale.com    13 年前

    “nevets1219”的第二个选项是在Notepad++中打开CSV文件并转换为ANSI。

    在顶部菜单中选择: 编码->转换为Ansi

        25
  •  1
  •   malenkiy_scot    12 年前

    编码->转换为Ansi将使用Ansi/UNICODE对其进行编码。Utf8是Unicode的一个子集。也许在ANSI中会被正确编码,但这里我们讨论的是UTF8,@SequenceDigitale。

    有更快的方法,例如导出为csv(逗号分隔),然后使用记事本++(免费)打开该csv,然后编码>转换为UTF8。但前提是每个文件必须执行一次。如果您需要频繁地更改和导出,那么最好是LibreOffice或GDocs解决方案。

        26
  •  1
  •   vladaman    12 年前

    Microsoft Excel有一个使用Unicode编码导出电子表格的选项。请参见以下屏幕截图。

    enter image description here

        27
  •  1
  •   Marius Gri    12 年前

    使用记事本++打开.csv fine。如果你看到你的编码是好的(你看到所有的字符应该是)按encoding,然后转换成ANSI 否则-找出你当前的编码方式

        28
  •  1
  •   Essam Altantawi    12 年前

    另一个解决方案是用winword打开文件并将其保存为txt,然后用excel重新打开,它将工作ISA

        29
  •  1
  •   Elia Weiss    9 年前

    保存对话框>“工具”按钮>“Web选项”>“编码”选项卡

        30
  •  0
  •   academic.user    10 年前

    我也有同样的问题 this 此外,它在excel 2013中的工作也非常好,除了它提到的excel 2007和2010之外。