代码之家  ›  专栏  ›  技术社区  ›  jeremyalan

在Excel 2007中导入带换行符的CSV

  •  99
  • jeremyalan  · 技术社区  · 16 年前

    我正在开发一个功能,将搜索结果导出到一个CSV文件,然后在Excel中打开。其中一个字段是自由文本字段,它可能包含换行符、逗号、引号等。为了抵消这种情况,我将该字段用双引号(“)括起来。

    我也尝试过用just CR(\r\n)替换CR/LF(\r\n),然后又用just LF(\n)替换,但没有成功。

    是否有其他人遇到过这种行为,如果是,您是如何解决的?

    蒂亚,

    编辑:
    这是我亲手写的一个快速文件来复制这个问题。

    身份证、姓名、描述

    我叫乔。”

    当我将其导入Excel2007时,我得到了一个标题行和两条记录。注意,“Smith,Joe”中的逗号处理得很好。只是线路中断造成了问题。

    20 回复  |  直到 7 年前
        1
  •  57
  •   J Ashley    12 年前

    Excel(至少在XP上的Office 2007中)的行为可能会有所不同,这取决于是否通过从文件打开CSV文件来导入它->打开菜单或双击资源管理器中的文件。

    我有一个用UTF-8编码的CSV文件,在一些单元格中包含换行符。如果我从Excel的文件打开此文件->打开菜单,弹出“导入CSV”向导,文件无法正确导入:即使引用换行符,也会启动新行。如果在资源管理器窗口中双击此文件以打开此文件,则无需向导的干预即可正确打开。

        2
  •  46
  •   Tim Stack    5 年前

    复制/粘贴csv文件中的数据(在文本编辑器中打开),然后执行“文本到列”--->数据转换不正确。

    下一步是转到最近的空列或空工作表并再次复制/粘贴(与剪贴板中已有的内容相同)-->现在可以自动工作了。

        3
  •  29
  •   ketil    8 年前

    如果手动执行此操作,请下载LibreOffice并使用LibreOffice Calc导入CSV。它比我用过的任何版本的Excel都能做得更好,如果以后需要转换到Excel,它可以根据需要保存到XLS或XLSX。

    但是如果你被Excel困住了,需要一个更好的解决方案,似乎有办法。它似乎依赖于地区(在我看来,这似乎很愚蠢)。我没有Excel 2007,但是我有Excel 2010,举个例子:

    ID,Name,Description
    "12345","Smith, Joe","Hey.
    My name is Joe."
    

    ID;Name;Description
    "12345";"Smith, Joe";"Hey.
    My name is Joe."
    

    但有个陷阱!唯一可行的方法是双击CSV文件在Excel中打开它。如果我尝试从文本中导入数据并选择这个CSV,那么它在引用的换行符上仍然失败。

    但是有一个 另一个 接住!工作字段分隔符(在原始示例中为逗号,在我的示例中为分号)似乎取决于系统的区域设置(在“控制面板”下设置->区域和语言)。在挪威,逗号是小数点分隔符。Excel似乎避免使用这个字符,而更喜欢使用分号。我可以访问另一台设置为英国英语语言环境的计算机,在那台计算机上,第一个带有逗号分隔符的示例运行良好(仅在双击时),而带有分号的示例实际上失败了!互操作性到此为止。如果你想在线发布这个CSV并且用户可能有Excel,我想你必须同时发布这两个版本,并建议人们检查哪个文件给出了正确的行数。

    所以我收集到的所有细节都是:

    1. 我在文本字段和记录分隔符中都使用了Windows行尾(\r\n),这很有效。
    2. 必须双击文件才能打开它,从文本导入数据不起作用。

    希望这对别人有帮助。

        4
  •  26
  •   jeremyalan    15 年前

    我终于找到问题了!

    谢谢大家的建议!

        5
  •  7
  •   Mazzy    7 年前

    使用googlesheets并导入CSV文件。

    然后你可以把它导出到Excel中

        6
  •  6
  •   robotik    9 年前

    简短的回答

    删除换行符/换行符( \n \r )分开记录。

    冗长的回答

    如上所述,CSV字段中支持换行符,但Excel并不总是优雅地处理它们。我在第三方CSV中遇到了类似的问题,它可能有编码问题,但编码更改后没有改善。

    \不

    显然,一个更干净的解决方案是首先替换真正的新行( \r\n )使用您选择的分隔字符(例如分号文件中的逗号),然后再次用适当的换行符替换临时字符。

        7
  •  4
  •   Jeremy    16 年前

    如果字段包含前导空格,Excel将忽略双引号作为文本限定符。解决方案是消除逗号(字段分隔符)和双引号之间的前导空格。例如:


    姓名、职务、描述

    工作:
    姓名、职务、描述

        8
  •  4
  •   Pikamander2    5 年前

    +1关于J Ashley的评论。我也遇到了这个问题。事实证明,Excel需要:

    • 带引号的字符串中的换行符(“\n”)

    例如。

    "Test", "Multiline item\n
    multiline item"\r\n
    "Test2", "Multiline item\n
    multiline item"\r\n
    

        9
  •  3
  •   Rock Rico    10 年前

    1) 安装LibreOffice 3) 我的txt文件中的字段用分隔,字符字段用“ 4) 另存为ODS文件 6) 另存为.xls(x) 8) 这对我很有效,节省了我很多时间!

        10
  •  2
  •   Aaron Dake    10 年前

        11
  •  2
  •   Dibs    9 年前

    我也有类似的问题。我在MySQL中有一些twitter数据。数据中有换行符(LF或\n)。我需要将MySQL数据导出到excel中。LF把我的csv文件导入搞砸了。所以我做了以下的事情-

    1. From MySQL exported to CSV with Record separator as CRLF
    2. Opened the data in notepad++ 
    3. Replaced CRLF (\r\n) with some string I am not expecting in the Data. I used ###~###! as replacement of CRLF
    4. Replaced LF (\n) with Space
    5. Replaced ###~###! with \r\n, so my record separator are back.
    6. Saved and then imported into Excel
    

    注意-在替换CRLF或LF时,不要忘记检查超出的(\n,\r\t。。。复选框[查看对话框的左下角)

        12
  •  2
  •   Kirby    7 年前

    • 您必须从资源管理器中双击该文件。不要从Excel打开它
        13
  •  2
  •   m000    6 年前

    在最初的帖子发布近10年后,Excel在导入CSV文件方面没有任何改进。但是,我发现导入HTML表要好得多。因此,可以使用Python将CSV转换为HTML,然后将生成的HTML导入Excel。

    步骤

    csvkit 用于执行到JSON的中间转换。这使我们可以避免在Python代码中处理CSV的复杂性。

    json2html.py . 脚本从stdin读取一个JSON文件并将其转储为一个HTML表:

    #!/usr/bin/env python3
    import sys, json, html
    
    if __name__ == '__main__':
        header_emitted = False
        make_th = lambda s: "<th>%s</th>" % (html.escape(s if s else ""))
        make_td = lambda s: "<td>%s</td>" % (html.escape(s if s else ""))
        make_tr = lambda l, make_cell: "<tr>%s</tr>" % ( "".join([make_cell(v) for v in l]) )
        print("<html><body>\n<table>")
        for line in json.load(sys.stdin):
            lk, lv = zip(*line.items())
            if not header_emitted:
                print(make_tr(lk, make_th))
                header_emitted = True
            print(make_tr(lv, make_td))
        print("</table\n</body></html>")
    

    然后,在虚拟环境中安装csvkit并使用 csvjson 将输入文件提供给脚本。使用 -I

    $ virtualenv -p python3 pyenv
    $ . ./pyenv/bin/activate
    $ pip install csvkit
    $ csvjson -I input.csv | python3 json2html.py > output.html
    

    现在 output.html 可以在Excel中导入。细胞中的断线将被保留下来。

    或者,您可能希望清理Python虚拟环境:

    $ deactivate
    $ rm -rf pyenv
    
        14
  •  1
  •   undefined    7 年前

    • 文件必须用BOM编码在UTF-8中,所以请考虑下面的所有要点
    • 到目前为止,最好的结果是从文件资源管理器中打开它
    • 如果从Excel中打开它,有两种可能的结果:
      • 如果它只有ASCII字符,它很可能工作
    • 它似乎严重依赖于
    • 我敢打赌,它的行为也可能因操作系统和应用程序而异
        15
  •  1
  •   SaSH_17    6 年前

    这是Excel 2016:

    数据->新建查询->从文件->从CSV->选择文件->导入->加载

    这是一个完美的工作和一个非常快速的解决办法,为你们所有人都有同样的问题。

        16
  •  0
  •   Martin    9 年前

    米/

        17
  •  0
  •   depassage    9 年前

    只需使用linebreak创建一个包含单元格的新工作表,将其保存到csv,然后使用可以显示行尾字符的编辑器(如notepad++)打开它。通过这样做,您将注意到单元格中的换行符是用LF编码的,而“实”行尾是用crlf编码的。瞧,现在你知道如何为excel生成一个“正确的”csv文件了。

        18
  •  0
  •   user3861859    9 年前

    我也有这个问题:例如,csv文件(逗号分隔,双引号分隔的字符串)中的LF在引号字符串。这些是下载的方形文件。我做了一个数据导入,但不是作为文本文件导入,而是作为“从HTML”导入。这次它忽略了引用字符串中的LF。

        19
  •  0
  •   2003G35    8 年前

    使用python编写csv文件。

    data='“单元格a1的第一行\r单元格a1的第二行\r单元格a1的第三行”,“单元格b1”,“单元格c1的第一行\r单元格c1的第二行”\n“单元格a2的第一行”\n'

        20
  •  0
  •   Tim    8 年前

    在MacOS上尝试使用数字

    数字 .csv

        21
  •  0
  •   adax2000    7 年前

    在我的例子中,在notepad++中打开CSV并添加 SEP=","

        22
  •  0
  •   Ionut    7 年前

    将分隔符替换为制表符(\t)而不是逗号(,)。

        23
  •  -1
  •   David Avikasis    7 年前

    Excel中的换行符解析取决于列表分隔符的OS设置:

    1. 资料来源: https://superuser.com/questions/238944/how-to-force-excel-to-open-csv-files-with-data-arranged-in-columns#answer-633302

    2. Mac:需要将区域更改为我们(然后手动将其他设置更改回您的首选项) 资料来源: https://answers.microsoft.com/en-us/mac/forum/macoffice2016-macexcel/line-separator-comma-semicolon-in-excel-2016-for/7db1b1a0-0300-44ba-ab9b-35d1c40159c6

    再次尝试之前,不要忘记完全关闭Excel。

    我已经成功地复制了这个问题,并且能够在Max和Windows中使用上面的方法修复它。

    推荐文章