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


129

我正在使用一项功能,可将搜索结果导出到CSV文件以在Excel中打开。字段之一是自由文本字段,其中可能包含换行符,逗号,引号等。为了解决此问题,我将该字段括在双引号(“)中。

但是,当我将数据导入Excel 2007,设置适当的定界符并将文本限定符设置为双引号时,换行符仍在换行符处创建新记录,我希望可以在换行符中看到整个文本字段。单细胞。

我还尝试过仅用CR(\ r)替换CR / LF(\ r \ n),然后再仅用LF(\ n)替换CR / LF,但是没有运气。

其他人是否遇到过此行为,如果是,您如何解决?

TIA,
-J

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

ID,名称,描述
“ 12345”,“ Smith,Joe”,“嘿。
我叫Joe。”

当我将其导入Excel 2007时,我得到一个标题行和两个记录。请注意,“ Smith,Joe”中的逗号已正确处理。只是换行引起了问题。


我已经在Notepad ++中查看了CSV文件,并且一切似乎都是正确的。我还有其他带有逗号的字段,并且它们已正确导入。只是换行引起了问题。
jeremyalan 2010年

4
我在使用多行数据和Excel的UTF8 .csv文件时遇到问题。我最终只是将文件上传到Google文档,将其打开到Google工作表中,然后下载为.xls文件。这样对我来说效果很好。
creuzerm 2015年

Answers:


53

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

我有一个UTF-8编码的CSV文件,并且在某些单元格中包含换行符。如果我从Excel的“文件”->“打开”菜单中打开此文件,则会弹出“导入CSV”向导,并且无法正确导入该文件:即使使用引号,换行符也会开始新的一行。如果我通过在资源管理器窗口中双击打开此文件,那么它将在没有向导干预的情况下正确打开。


1
知道如何获得与双击相同的设置吗?
米歇尔·塔伦

7
这是真的!多奇怪。
戴维(David)

5
如果您使用的是德国区域设置,则必须在csv中使用分号(;)而不是逗号(,)才能使双击起作用...
user1859022,2015年

3
它对我没有用。用“,”作为定界符,双击可以在一列中打开所有内容。用“;” 作为分隔符,除了多行文本字段(作为多条记录导入)外,它已正确导入。我拥有Excel 2010
Andrej Adamenko '16

2
@ user1859022对于匈牙利语言环境,我将其加倍。实际上,使用逗号作为小数点分隔符的任何语言环境都必须使用分号作为双击csv open的字段分隔符才能正常工作
robotik 2016年

42

没有建议的解决方案对我有用。

实际有效的方法(使用任何编码):

从csv文件复制/粘贴数据(在编辑器中打开),然后执行“列中的文本”->不起作用,好的。

转到下一个选项卡,然后再次复制/粘贴(与剪贴板中已有的内容相同)->现在可以自动工作了。


2
在我的情况下,它以某种方式起作用:它正确地将CSV折叠为单个记录,但删除了换行符之后的字段中的所有数据。
Lilienthal 2014年

1
这行得通,有什么想法为什么从excel导入csv时行不通?
拉斐尔·西斯托

1
我可以确认这是可行的,甚至可以将更多数据粘贴到不同的工作表中,而无需重复“从文本到列”命令。如果您需要导入多个文件,这将很有用。
亚历克斯(Alex)

1
为什么这样做有效,但没有打开CSV或使用所有正确的设置将其添加为文本数据都无法正常工作?谢谢你的提示。复制/粘贴团队需要与数据导入团队联系!
alexGIS

2
妈的 这确实有效。这是有道理的。当创建“文本到列”时,Excel会记住设置,它将自动转换。当文本已经分成几行时,它将逐行显示并忽略新行。我认为MS应该包括一个复选框,以保持行为或重新扫描数据。我不在乎,...如果
怪胎

28

如果您手动执行此操作,请下载LibreOffice并使用LibreOffice Calc导入CSV。这样的事情比我尝试过的任何版本的Excel都要好得多,如果以后需要转移到Excel,它可以根据需要保存到XLS或XLSX。

但是,如果您坚持使用Excel并需要更好的修复,似乎有一种方法。它似乎是依赖于语言环境的(在我的拙见中,这似乎是愚蠢的)。我没有Excel 2007,但是我有Excel 2010,并提供了示例:

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

不起作用。我在记事本中编写了它,然后选择“另存为...”,然后在“保存”按钮旁边可以选择编码。我按照建议选择了UTF-8,但是没有运气。不过,将逗号更改为分号对我有用。我没有进行任何其他更改,并且一切正常。因此,我将示例更改为如下所示,并在保存在记事本中时选择了UTF-8编码:

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

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

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

因此,我能够收集到的所有细节都可以使它起作用:

  1. 该文件必须另存为带有BOM的UTF-8,这是记事本在选择UTF-8时所做的事情。我尝试了没有BOM的UTF-8(可以在Notepad ++中轻松切换),但是双击文档失败。
  2. 您必须使用逗号或分号分隔符,但不能使用“区域设置”中的小数点分隔符。也许其他角色也可以,但是我不知道哪个。
  3. 您必须引用包含带有“”字符的换行符的字段。
  4. 我在文本字段和记录分隔符中都使用了Windows行尾(\ r \ n),它可以正常工作。
  5. 您必须双击该文件才能将其打开,无法从文本导入数据。

希望这对某人有帮助。


另外,@ sdplus提到的技巧似乎有效!我认为发生的事情是,当您第一次粘贴并执行“文本到列”操作时,您正在Excel中配置引号和字段分隔符。第二次粘贴时,它将使用此配置,并根据该配置将数据正确地分成几列。但这似乎是一种非常手动的方法。
凯蒂尔(Ketil)2015年

是的,每次您导入文本或执行“文本到列”操作时,都需要重新校准复制/粘贴在给定会话中的工作方式。它甚至会应用于您创建的新工作簿,直到您关闭Excel。它也可能令人沮丧。使用给定的分隔符进行导入后,即使您只想在单元格中粘贴一个句子,它也将以此分隔文本。您必须使用制表符作为分隔符来重做导入,或者重新启动Excel以停止它。
robotik

你的把戏似乎真的有效。但是看起来分号与解决方案无关。问题在于,根据地区设置,Excel对CSV文件的处理方式不同。我来自德国,对我来说,Excel的CSV文件始终使用分号而不是逗号(原因是在德国,小数点分隔符是逗号而不是点)。真正的解决方案似乎是,Excel加载的CSV文件与所有其他文本文件完全不同。因此,在引号之间包含换行符的CSV文件似乎有效。所有其他文本文件都没有。
马提尼·比安科

@Martini,是的,我有Norwegian Excel,我们也使用逗号作为小数点分隔符,因此,我已经提到了这如何取决于区域设置(尽管我将其称为语言环境)。也许我应该改写清楚。
凯蒂尔(ketil),2017年

这是逗号为小数点分隔符的区域中所有人员的答案。请注意,对于这些区域,Excel还使用分号作为公式参数分隔符(=FOO(1;2)而不是=FOO(1,2)),但显然Excel将其应用于文件格式解析器(该其他程序根据区域设置解析标准文件格式)是不正确的? )
leemes

25

我终于找到了问题!

事实证明,我们使用Unicode编码而不是ASCII或UTF-8编写文件。更改FileStream上的编码似乎可以解决问题。

感谢大家的所有建议!


29
ASCII编码似乎并没有为我解决问题(尽管在MacOS上),而且我没有前导空格,并且引用了我的字段。完全相同的文档可以在Google文档中导入。真令人沮丧 顺便说一句,没有诸如“ Unicode”编码的文本文件之类的东西。它必须是Unicode的实现之一(UTF-8,UTF-16,UTF-32等)
2012年

11
感谢您的解决方案。我仍然很好奇答案是什么,所以我尝试在Excel中创建带有换行符的csv并查看其保存了什么。我发现Excel仅将换行符用于单元格中的新行。如果我尝试在记事本中创建相同的csv,它将使用换行符+回车符作为换行符。因此,对于单个单元格中的换行符,请确保仅使用换行符(LF或\ n),而不使用回车符(CR或\ r)。Excel确实使用这两者来终止行。
xr280xr 2012年

1
ASCII编码没有解决问题,对我也- ,Windows 7中的Excel 2000
ChrisJJ

1
对于Macintosh上的OS X,另存为“ Windows逗号分隔(csv)”。这将添加换行符而不是换行符。它会在“特殊格式”下的格式下拉菜单中列出。
塔可

应该使用哪种Unicode编码(UTF-8,UTF-16)?
Andrej Adamenko '16

7

简短答案

删除换行符/换行符(\n使用Notepad ++)。Excel仍将识别回车符(\r)以分隔记录。

长答案

如前所述,CSV字段内支持换行符,但Excel并不总是很好地处理它们。我遇到了第三方CSV的类似问题,该第三方CSV可能存在编码问题,但随着编码更改而没有改善。

对我有用的是删除所有换行符(\n)。假设您的记录由回车符和换行符(CR / LF)分隔,则这将字段折叠为单个记录。Excel随后将正确导入文件并通过回车识别新记录。

显然,一种更清洁的解决方案是先用\r\n临时字符组合替换实际的换行符(\n),用您选择的分隔字符(例如,分号文件中的逗号)替换换行符(),然后再用适当的换行符替换临时字符。


1
我遇到了相反的情况:\n线与\r\n内部值之间。只是在Notepad ++中剥离了后者。
腊斯特

5

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

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

  • 每行之间的回车和换行符。

例如, “测试”,“多行项目\ n多行项目” \ r \ n“测试2”,“多行项目\ n多行项目” \ r \ n

我使用记事本++来正确分隔每一行,并且仅在字符串中使用换行符。通过在空白的excel文档中创建多行条目并在记事本++中打开CSV来发现此问题。


一旦我根据自己的语言环境设置了字段分隔符,它就对我来说只用换行符作为多行项和行分隔符就
起作用了

4

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

损坏:
名称,标题,描述
“约翰”,“先生”,“我的详细描述”

工作:
姓名,职称,描述
“约翰”,“先生”,“我的详细描述”


2
我同意,但是,我的输出中没有任何前导空格。有任何想法吗?
jeremyalan 2010年

我们需要断线:(
路加福音

4

使用Google表格并导入CSV文件。

然后您可以导出该文件以在Excel中使用


1
好提示!如果可以将CSV上传到第三方服务(即非机密数据),则这是最方便的转换方法。请注意,您可能必须在导入时手动设置定界符。并且您可能需要调整生成的Excel文件中的单元格大小,以使其正确显示。
m000

还可以在浏览器中的Office 365中与Excel一起使用。我无法使用桌面Excel应用程序在单元格内部正确打开带换行符的CSV(尝试从此页面尝试大多数建议),但是office.com上的Excel可以正确打开它。
乔治·w。

3

如果有人跌跌撞撞地穿越这个线程,并且正在寻找一个明确的答案,那就可以了(向提及LibreOffice的人致谢:

1)安装LibreOffice 2)打开Calc并导入文件3)我的txt文件中的字段用分隔,“ 4)中的字符字段另存为ODS文件5)在Excel中打开ODS文件6)另存为.xls(x) 7)完成8)这对我来说非常有效,并节省了我的BIGTIME!


3
无需另存为ODS,LibreOffice可以原生保存xls(x)
robotik


2

我有一个类似的问题。我在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 ...复选框[请看对话框的左下角)


2

我在具有法语区域设置的WinXP上使用Excel 2010的经验

  • 您导入的csv的分隔符必须与您的区域设置的列表分隔符相对应(在我的情况下)
  • 您必须双击资源管理器中的文件。不要从Excel打开它

1

处理CSV时,Excel异常损坏。LibreOffice做得更好。因此,我发现:

  • 该文件必须使用BOM表以UTF-8编码,因此请注意以下几点
  • 到目前为止,最好的结果是通过从文件资源管理器中打开它来实现的
  • 如果从Excel中打开它,可能会出现两种结果:
    • 如果只有ASCII字符,则很可能会工作
    • 如果包含非ASCII字符,则会使换行符混乱
  • 它似乎在很大程度上取决于操作系统区域设置中配置的小数点分隔符,因此您必须选择正确的小数点
  • 我敢打赌,根据操作系统和Office版本的不同,它的行为也可能有所不同

你主张的LibreOffice是一个更好的猜测者比Excel中,对不对?导入文本文件时,Excel会询问所有正确的问题,除非您让其猜测。
汤姆·布洛杰特

1
谢谢!它可以帮助我通过Notepad ++将CSV从“无BOM的UTF-8”转换为“有BOM的UTF-8”(菜单中只是简单的“ UTF-8”)。然后,我只是从资源管理器中打开它,然后Excel以正确的方式用正确的符号和正确的单元格内的换行符显示了它。当我从Explorer Excel中以默认的“无BOM的UTF-8”编码打开它时,导入的行正确地断了,但是以错误的方式显示了非拉丁符号。如果我从Excel中打开它,它会以正确的方式显示编码,但是无法应付换行符。
Sergey Beloglazov

1

总览

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

这种方法的优点是:(a)工作可靠,(b)无需将数据发送到第三方服务(例如Google表格),(c)不需要额外的“胖”安装(LibreOffice,数字等),对于大多数用户而言,(d)比干预CR / LF字符和BOM标记的级别更高,(e)无需摆弄语言环境设置。

脚步

只要安装了Python 3,以下步骤就可以在任何类似bash的外壳上运行。尽管可以使用Python直接读取CSV,可以使用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

1

这适用于Excel 2016:

使用Excel向导在csv文件中换行时遇到了同样的问题。

之后,我尝试使用“新查询”功能:数据->新查询->从文件->从CSV->选择文件->导入->加载

对于所有遇到相同问题的人,它都运行得很好,并且是一种非常快速的解决方法。


0

对于我来说,直接导入Excel的方法是正确的,前提是导入是以文本格式而不是csv格式完成的。M /


0

只需使用带有换行符的单元格创建一个新工作表,将其保存到csv,然后使用可以显示行尾字符(例如notepad ++)的编辑器将其打开。这样,您将注意到单元格中的换行符是用LF编码的,而“实”行的末尾是CR LF的编码。Voilà,现在您知道如何为excel生成“正确的” csv文件。


0

我也有这个问题:即,带引号的LF中的csv文件(逗号分隔,双引号分隔的字符串)。这些是下载的Square文件。我进行了数据导入,但是没有导入为文本文件,而是导入为“从HTML”。这次,它忽略了引用字符串中的LF。


0

在Mac上可以使用csv并在Excel中打开文件。

使用python编写csv文件。

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

file.write(数据)


0

在MacOS上,尝试使用数字

如果可以访问Mac OS,我发现Apple电子表格Numbers可以很好地取消Excel无法处理的复杂的多行CSV文件。只需.csv使用数字打开,然后导出到Excel。


0

就我而言,在notepad ++中打开CSV并添加SEP=","为第一行使我可以在Excel中打开带有换行符和utf-8的CSV文件,而不会出现问题


0

用TAB(\ t)代替逗号(,)代替分隔符。然后在编辑器(记事本等)中打开文件,从中复制内容,然后将其粘贴到Excel文件中。


在大文件上尝试:)
chukko

-1

根据CSV标准,双引号内的换行符非常好。Excel中的换行符解析取决于列表分隔符的操作系统设置:

  1. Windows:您需要将列表分隔符设置为逗号(区域和语言»格式»高级)来源:https : //superuser.com/questions/238944/how-to-force-excel-to-open-csv-files-列中有数据安排#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(请参阅NewmanLee的答案)

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

我已经成功地复制了该问题,并能够在Max和Windows中使用上述方法修复该问题。


我认为这行不通。我从Excel本身导出了带有换行符的CSV文件。由于语言环境没有更改,因此Excel应该能够正确加载它。但是不能。它仍然与单元格中的换行符混淆。
m000
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.