我正在开发一项功能,可将搜索结果导出到要在Excel中打开的CSV文件中。其中一个字段是一个自由文本字段,可能包含换行符,逗号,引号等。为了抵消这一点,我将字段用双引号括起来(“)。
但是,当我将数据导入Excel 2007时,设置适当的分隔符,并将文本限定符设置为双引号,换行符仍然在换行符处创建新记录,我希望看到整个文本单个单元格中的字段。
我也尝试用CR(\ r)替换CR / LF(\ r \ n),再用LF(\ n)替换,但没有运气。
是否有其他人遇到过这种行为,如果有,你是如何解决的?
TIA,
-J
修改
这是我手工编写的快速文件,用于复制问题。
ID,名称,描述
“12345”,“史密斯,乔”,“嘿。
我叫乔。“
当我将其导入Excel 2007时,我最终得到一个标题行和两个记录。请注意,“Smith,Joe”中的逗号正在正确处理。这只是造成问题的换行符。
答案 0 :(得分:44)
Excel(至少在Office 2007 on XP上)可能会有不同的行为,具体取决于是否通过从File->打开菜单打开CSV文件或通过在资源管理器中双击该文件来导入CSV文件。
我有一个UTF-8编码的CSV文件,并在某些单元格中包含换行符。如果我从Excel的文件 - >打开菜单中打开此文件,那么"导入CSV"弹出向导并且无法正确导入文件:即使引用,换行也会启动新行。如果我在资源管理器窗口中双击打开此文件,则会在没有向导干预的情况下正确打开。
答案 1 :(得分:29)
所有建议的解决方案都不适合我。
实际有效(使用任何编码):
从csv文件复制/粘贴数据(在编辑器中打开),然后执行“列中的文本” - >没事,没事。
转到下一个标签并再次复制/粘贴(与剪贴板中已有的相同) - >现在自动化。
答案 2 :(得分:24)
我终于找到了问题!
事实证明我们使用Unicode编码而不是ASCII或UTF-8编写文件。更改FileStream上的编码似乎可以解决问题。
感谢大家提出的所有建议!
答案 3 :(得分:23)
如果您是手动执行此操作,请下载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,我猜您必须发布这两个版本并建议人们检查哪个文件提供正确的行数。
所以我能够收集到的所有细节都是:
希望这有助于某人。
答案 4 :(得分:6)
使用Notepad ++删除换行符/换行符(\n
)。 Excel仍会识别回车符(\r
)以分隔记录。
如上所述,CSV字段中支持换行符,但Excel并不总是正常处理它们。我遇到了类似的问题,第三方CSV可能存在编码问题,但编码更改没有改善。
对我有用的是删除所有换行符(\n
)。这具有将字段折叠到单个记录的效果,假设您的记录由回车符和换行符(CR / LF)的组合分隔。然后Excel将正确导入文件并通过回车识别新记录。
显然,更清晰的解决方案是首先用临时字符组合替换真实换行符(\r\n
),用您选择的分隔符替换换行符(\n
)(例如,分号文件中的逗号) )然后再用适当的换行符替换临时字符。
答案 5 :(得分:5)
如果该字段包含前导空格,则Excel会将双引号忽略为文本限定符。解决方案是消除逗号(字段分隔符)和双引号之间的前导空格。例如:
破碎的:
名称,标题,说明
“约翰”,“先生”,“我的详细说明”
工作:
姓名,标题,描述
“约翰”,“先生”,“我的详细说明”
答案 6 :(得分:2)
粘贴到Notepad ++中,选择编码>用ANSI编码,再次复制并粘贴到Excel中:)
答案 7 :(得分:2)
我在使用法语区域设置的WinXP上使用Excel 2010的经验
答案 8 :(得分:2)
如果有人绊倒这个帖子并且正在寻找一个确定的答案,那么(感谢提到LibreOffice的人:
1)安装LibreOffice 2)打开Calc和导入文件 3)我的txt文件将字段分隔,并且字符字段包含在" 4)保存为ODS文件 5)在Excel中打开ODS文件 6)另存为.xls(x) 7)完成。 8)这对我来说非常合适,并为我节省了大笔时间!
答案 9 :(得分:1)
这是用于Excel 2016:
使用Excel向导在csv文件中换行符也遇到同样的问题。
之后,我尝试使用“新查询”功能: 数据->新查询->从文件->从CSV->选择文件->导入->加载
对于所有遇到相同问题的人来说,它运行得非常完美,并且是一种非常快速的解决方法。
答案 10 :(得分:1)
使用Google表格并导入CSV文件。
然后,您可以导出该内容以在Excel中使用
答案 11 :(得分:1)
我有类似的问题。我在MySQL中有一些推特数据。数据在数据中有换行符(LF或\ n)。我需要将MySQL数据导出到excel中。 LF搞砸了我导入的csv文件。所以我做了以下 -
guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath as IndexPath) as? PlayerTableViewCell else {
fatalError("The dequeued cell is not an instance of PlayerTableViewCell")
}
注意 - 在更换CRLF或LF时不要忘记检查超出(\ n,\ r,\ t ...复选框[查看对话框的左下角]
答案 12 :(得分:0)
我也有这个问题:ie。,csv文件(逗号分隔,双引号分隔的字符串),带引号字符串的LF。这些是下载的Square文件。我进行了数据导入,但不是作为文本文件导入,而是从HTML"导入为"。这次它忽略了引用字符串中的LF。
答案 13 :(得分:0)
这适用于Mac,使用csv并在Excel中打开文件。
使用python编写csv文件。
data ='“单元格a1 \ r \ n第2行单元格a1 \ r \ n第3行单元格a1”,“单元格b1”,“单元格c1中第1行\ r \ n单元格c1中第2行”\ n“单元格a2“\ n”
中的第一行file.write(数据)
答案 14 :(得分:0)
在我的情况下,在记事本++中打开CSV并添加SEP=","
作为第一行,这样我就可以在Excel中打开带有换行符的CSV和utf-8
答案 15 :(得分:0)
用TAB(\ t)代替逗号(,)代替分隔符。 然后在编辑器(记事本等)中打开文件,从那里复制内容,然后将其粘贴到Excel文件中。
答案 16 :(得分:0)
根据CSV标准,双引号内的换行符非常好。 Excel中的换行符解析取决于列表分隔符的操作系统设置:
Windows:您需要将列表分隔符设置为逗号(区域和语言»格式»高级) 来源:https://superuser.com/questions/238944/how-to-force-excel-to-open-csv-files-with-data-arranged-in-columns#answer-633302
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中使用以上内容修复此问题。
答案 17 :(得分:0)
处理CSV时,Excel异常损坏。 LibreOffice做得更好。因此,我发现:
答案 18 :(得分:0)
只需使用带有换行符的单元格创建一个新工作表,将其保存到csv,然后使用可以显示行尾字符的编辑器(如记事本++)打开它。通过这样做,您会注意到单元格中的换行符使用LF编码,而“实际”行尾是使用CR LF的代码。 Voilà,现在您知道如何为excel生成“正确的”csv文件。
答案 19 :(得分:0)
在原始帖子发布将近10年之后,Excel在导入CSV文件方面并没有改善。但是,我发现导入HTML表要好得多。因此,可以使用Python将CSV转换为HTML,然后将生成的HTML导入Excel。
此方法的优点是:(a)它可靠地工作,(b)您不需要将数据发送到第三方服务(例如Google表格),(c)不需要额外的“胖”安装(LibreOffice,Numbers等),对于大多数用户而言,(d)比干预CR / LF字符和BOM标记的级别更高,(e)无需摆弄语言环境设置。
只要安装了Python 3,以下步骤就可以在任何类似bash的shell上运行。尽管可以使用Python直接读取CSV,但是csvkit用于将中间转换为JSON。这样可以避免在Python代码中处理CSV复杂性。
首先,将以下脚本另存为<!DOCTYPE html>
<html>
<head>
<title>Example: Getting Attributes</title>
</head>
<body>
<h3>CIW JavaScript Specialist</h3>
<hr>
<div id="SetDiv" special_attribute="CIW rules!" align="left">
<p><h3>What are the attributes of this div tag?</h3></p>
</div>
<input type="button" value="Click Me!" onclick="getValues()">
<p><h3>Please click the button now</h3></p>
<script type="text/javascript">
var div = null;
function getValues()
{
if (div == null)
{
div = document.getElementById("SetDiv");
}
alert(div.id);
alert(div.special_attribute);
alert(div.align);
var align = document.getElementById("SetDiv").getAttribute("align");
alert("getAttribute = " + align);
var align = document.getElementById("SetDiv");
align.setAttribute("align", "center");
alert("setAttribute changes to center!");
align.setAttribute("align", "right");
alert("setAttribute changes to right!");
align.setAttribute("align", "left");
alert("setAttribute changes to left!");
}
</script>
</body>
</html>
。该脚本从stdin读取JSON文件并将其转储为HTML表:
json2html.py
然后,在虚拟环境中安装csvkit并使用#!/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>")
将输入文件提供给我们的脚本。最好使用csvjson
参数禁用单元格类型猜测:
-I
现在$ virtualenv -p python3 pyenv
$ . ./pyenv/bin/activate
$ pip install csvkit
$ csvjson -I input.csv | python3 json2html.py > output.html
可以在Excel中导入。单元格中的换行符将被保留。
(可选)您可能希望清理Python虚拟环境:
output.html
答案 20 :(得分:0)
直接导入到Excel中的是什么,只要导入是以文本格式而不是csv格式完成的。 M /