格式化逗号分隔的 CSV 以强制 Excel 将值解释为字符串

Sim*_*ast 93 csv formatting string text-formatting microsoft-excel

我一直在寻找一段时间,试图弄清楚如何以强制 Excel 将值解释为字符串而不是尝试将它们转换为数字或日期的方式输出 CSV 文件。

例如:

"141", "10/11/2002", "350.00", "1311742251"
Run Code Online (Sandbox Code Playgroud)

Excel 试图“智能地”将所有这些转换为其原生日期/数字格式。有没有办法解决这个问题?


编辑:澄清了我的问题的意图,抱歉混淆。

Sim*_*ast 98

对于那些可以控制源数据的人,显然 Excel 将自动检测 CSV 字段的格式,除非 CSV 列采用以下格式:

"=""Data Here"""

例如...

20,       5.5%,      "0404 123 351", "3-6",  "=""123"""
[number]  [percent]  [number]        [date]  [string]  <-- how Excel interprets
Run Code Online (Sandbox Code Playgroud)

它也适用于 Google 电子表格,但不确定其他电子表格应用程序是否支持此表示法。

如果您怀疑任何数据本身可能包含引号,则需要对它们进行双重转义,如下所示...

"=""She said """"Hello"""" to him"""
Run Code Online (Sandbox Code Playgroud)



(编辑:更新更正,感谢 DMA57361!)

  • 不确定其他人如何没有注意到这个细节,这是一条重要的信息:Excel 在保存 csv 时不会保留这种格式。因此,这仅在您是只读的,或者您永远不需要再次导出到 csv 时才有效。 (3认同)
  • 太棒了,我们只需要更改数据..*叹气* (2认同)
  • @Breakthrough 那个表代表一个 CSV 文件,*不是* Excel 字段。最后一个值 `="123"` 不是一个有效的 CSV 字段,因为它包含字段分隔符 `"` *而没有*正确地分隔它或字段。Excel 碰巧将它作为公式读取的事实完全取决于 Excel与 CSV 文件无关。 (2认同)
  • @PriceChild,我最初的问题(我并没有很好地解释)实际上是如何格式化 CSV 以使其*尽可能简单*为用户。这就是我找到自己并想发布的答案。DMA57361 实际上也带来了有用的修正,谢谢! (2认同)

aja*_*abo 54

像许多人一样,我一直在为 Microsoft 做出的相同决定而苦苦挣扎,并尝试了各种建议的解决方案。

对于 Excel 2007,如下所示:

  • 将所有值放在双引号中无济于事
  • 在将它们放入双引号后在所有值之前放置一个=确实有帮助,但会使 csv 文件对大多数其他应用程序无用
  • 在所有值的双引号周围加上括号是垃圾
  • 在将双引号括起来之前在所有值之前放置一个空格会阻止转换为日期,但不会阻止修剪前导零或尾随零。
  • 将单引号放在值前仅在 Excel 中输入数据时有效。

然而:

在将双引号括起来之前在所有值之前放置一个制表符确实可以防止转换为日期并且可以防止修剪前导零或尾随零,并且工作表甚至不会在每个单元格的左上角显示令人讨厌的警告标记。

例如:

"<tab character><some value>","<tab character><some other value>"
Run Code Online (Sandbox Code Playgroud)

请注意,制表符必须在双引号内。编辑:事实证明,双引号甚至不是必需的。

双击 csv 文件可以将文件作为 Excel 中的电子表格打开,其中显示所有作为上面处理的值,如文本数据。确保将 Excel 设置为使用“.” 作为小数点而不是','或者 csv 文件的每一行都将在每行的第一个单元格中作为一个文本结束。显然微软认为 CSV 意味着“不是小数点”分隔值。

  • 这个制表符技巧救了我的命,Excel 将非常长的数值转换为数字,并在 15 号之后丢失了所有数字。设法让 Excel 将它们视为带有制表符前缀的文本。因此也适用于数字,而不仅仅是日期。 (2认同)

DMA*_*361 23

使用 Excel 的导入功能,您可以指定每列应被解释为的格式(自动、文本或日期),并且不需要对数据文件进行任何修改。

你可以找到它Data吗?Get External Data? From Text在 Excel 2007/2010 中。
或者DataImport External Data? Import Data在 Excel 2003 中。

这是 Excel 2003 文本导入向导对给定示例数据的操作图像,显示我将后两列作为文本导入:

Excel 2003:第 3 步的文本导入向导 - 数据类型


小智 5

西蒙的例子对我来说不起作用,我怀疑这是语言差异。在 C# 中,我的工作格式字符串如下所示:

var linebreak = (i++ == list.Count) ? "" : "\r\n";

csv += String.Format("=\"{0}\",{1},{2},{3},=\"{4}\"{5}",
    item.Value, item.Status, item.NewStatus, item.Carrier, c.Status, linebreak);
Run Code Online (Sandbox Code Playgroud)

输出文件如下所示:

="abababababab",INVALID,INVALID,USPS,="",
="9500100030492359000149",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9500100030492359000149",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9500100030492359000149",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9500100030492359000149",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9400110200793482982812",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9400110200793482982812",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9400110200793000216184",UNKNOWNSTATUS,INVALID,USPS,=""
Run Code Online (Sandbox Code Playgroud)

可以看出,输出文件中的格式不是="VALUE","=""VALUE""",认为可能是 Visual Basic 约定的格式。

我正在使用 Excel 2010。顺便说一句,Google Sheets 不会打开/转换以此方式格式化的文件。如果您删除等号,它将起作用"VALUE",- Excel 仍然会打开文件,但忽略您希望列成为字符串的事实。

  • 我也使用了这种格式,发现 Excel for Office 365 (2019) 支持“Value”,而不是接受的答案中的“=”“VALUE”“”。 (2认同)