Excel CSV导入将带引号的数字字符串视为数字值,而不是字符串


13

我有一个Web应用程序,正在将其数据导出到CSV文件。这是有问题的CSV文件的示例行:

28,"65154",02/21/2013 00:00,"false","0316295","8316012,8315844","MALE"

由于无法发布图像,因此必须在Excel中解释结果。“ 0316295”字段变为数字,并且前导0消失。“ 8316012,8315844”被解释为一个单一数字:83,160,128,315,844。也就是说,最明显的是,这不是预期的结果。

我见过有人建议在这种情况下使用单引号引起来,但这也不起作用。

28,"65154",02/21/2013 00:00,"false","'0316295","'8316012,8315844","MALE"

单引号始终在Excel的单元格中可见,但是如果我自己输入带有前导单引号的数字,则它仅显示预期的字符串,而不显示带字符串的单引号。

看来导入与输入不一样。

有人在这里有解决方案吗?


您可以使用LibreOffice或类似工具导入它吗?我刚刚导入并得到:28 65154 02/21/2013 00:00 false 0316295 8316012,8315844男(如果您能读到……?)
FreudianSlip

这个问题是相似的,并提供了一些很好的解决方案:superuser.com/questions/234997/...
布拉德·巴顿

@FreudianSlip不,我们不能使用某些第三方解决方案。用户单击“下载CSV”按钮,该文件将在Excel中打开。那就是我们要处理的环境。真的不能使它复杂化。
Michael Oryl 2013年

@Brad我早些时候读过这篇文章,以寻求解决方案。那是我从中获得单引号选项的地方,我真的不喜欢它,因为从CSV导入时Excel会在单元格本身中显示引号(即使您自己键入相同的内容也不会显示引号)。
Michael Oryl 2013年

因此,您是否至少控制了Web应用程序?您将如何对用户透明地实施该解决方案?我已经更新了答案,因此可以正确地用逗号处理值
Alex P.

Answers:


10

这应该工作

28,"65154",02/21/2013 00:00,"false",="0316295","=""8316012,8315844""","MALE"

不,那会破坏其中包含两个数字的值。我们不收报价为简单的数字得到=“1234567没有工作,虽然。
迈克尔Oryl

1
如果您控制Web应用程序,则可以实现导出为SYLK en.wikipedia.org/wiki/SYmbolic_LinK_(SYLK)格式。它具有更好的数据表示控制。如果没有的话-您可以轻松制作转换器脚本
Alex P.

2
更新了答案,以便可以正确地用逗号处理值
Alex P.

正确处理了逗号分隔的值。谢谢。
Michael Oryl

谢谢。该解决方案还解决了导入十六进制数的问题。Excel替换00E3为0(0 * 10 ^ 3),并将其显示为科学符号(0.00E + 00)。它实际上完成了同样的"00e3"没有=。但是="00e3"效果很好。(使用Excel 2010打开CSV)
mpag

12

要保留前导零,可以在“文本导入向导”中将该特定列的格式设置为“文本”。

  1. 通过转到“ 数据”选项卡并单击“ 从文本”启动“ 文本导入向导”
  2. 选择要导入的CSV文件。
  3. 选择分隔并点击下一步
  4. 取消选中选项卡(默认)。选择逗号。确保“ 文本限定符”设置为"。点击下一步
  5. 在这里可以指定格式。单击要保留其前导零的列的标题。选择文本。(见下图)

    在此处输入图片说明

  6. 点击完成,然后为您的数据选择一个合适的位置。样本结果:

    在此处输入图片说明

编辑还有另一种方法;将网络应用导出到以逗号分隔的.TXT文件而不是.CSV(或保存后仅更改导出文件的文件扩展名)。当他们打开文件时,这将迫使Excel通过导入向导。另外一个优点是,它减少了用户修改或篡改原始数据的机会。


1
是的,确实是这样。相比之下,最终用户所要做的就是在我们的Web应用程序上单击CSV生成器的链接,然后Excel会自动加载它,尽管最终存在上述问题,但这对于最终用户而言并不十分方便。CSV文件设置为在Excel中打开,并且Excel当时不提供任何选项。它只是加载它们。不过,我感谢您指出这一点。
Michael Oryl 2013年

1
还有另一种方法,但我不知道您是否可行:将Web应用导出为逗号分隔.TXT而不是.CSV(或仅更改导出文件的文件扩展名)。这种“强制”用户在打开文件时必须通过导入向导。
Ellesa 2013年

这是非常好的一点。感谢您指出了这一点。将来可能会有用。
Michael Oryl 2013年

4

Excel将以制表符开头的数字值视为文本。

<tabchar>000000100000200000,ABC,DEF

将显示为:

000000100000200000|ABC|DEF

| 是单元格边界(出于说明目的)。因此,例如,如果您的系统使用utf-8字符集生成CSV文件,则可以&#x0009;在数值前添加(十六进制制表符),以强制excel将其解释为文本。


在十六进制表示中删除半冒号之前的空格。我不知道如何在答案中转义“十六进制制表符”,所以我故意将其键入错误。
Madeyedexter 2015年

1
我做了转义。我学到了一些新东西,谢谢。我必须将此添加到我最喜欢的工作主题中:)
nixda

3

除非CSV列采用以下格式,否则Excel将自动检测CSV字段的格式:

"=""Data Here"""

这也适用于Google表格


0

您必须在Excel中使用“数据->获取外部数据->从文件导入文本”功能,才能将其显示为文本。这是@Kaze提到的文本导入向导。

强制excel从输入中将数字显示为文本而无需用户执行任何操作的唯一方法是输出excel文件并在其中指定“自定义数字格式”。我建议为此使用XLS导出库,因为它看起来并不像在CSV文件中添加一行配置文本那样简单。


0

尝试使用clean函数处理混乱的值。例如= clean(“ 12345678901234567890”)。它对我有用,适用于数字,日期,时间等。我要提醒您,由于这并非此功能的全部目的,因此该功能可能会停止使用新版本等。

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.