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

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

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

例如:

"141", "10/11/2002", "350.00", "1311742251"

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


编辑:澄清了我的问题的目的,抱歉造成混淆。

答案1

对于那些可以控制源数据的人来说,显然 Excel 会自动检测 CSV 字段的格式,除非 CSV 列是这种格式:

"=""Data Here"""

例如...

20,       5.5%,      "0404 123 351", "3-6",  "=""123"""
[number]  [percent]  [number]        [date]  [string]  <-- how Excel interprets

它也适用于 Google 电子表格,但不确定其他电子表格应用程序是否支持这种符号。

如果你怀疑任何数据本身可能包含引号,你需要双重转义他们,像这样……

"=""She said """"Hello"""" to him"""



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

答案2

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

对于 Excel 2007 来说,情况如下:

  • 将所有值放在双引号中没有帮助
  • 放置一个=将所有值放在双引号中确实有帮助,但是会使 csv 文件对大多数其他应用程序无用
  • 在所有值周围加上双引号是错误的
  • 在所有值前面加上双引号之前加上一个空格确实可以防止转换为日期,但不能防止修剪前导零或尾随零。
  • 仅在 Excel 中输入数据时在值前面放置单引号才有效。

然而:

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

例如:

"<tab character><some value>","<tab character><some other value>"

请注意,制表符必须位于双引号内。编辑:事实证明双引号甚至没有必要。

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

答案3

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

在 Excel 2007/2010 中,您可以按DataGet External Data→找到它。在 Excel 2003 中, 则按→ →找到它。From Text
DataImport External DataImport Data

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

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

答案4

如果所讨论的文本太长,我对 Simon 的回答有异议(我认为是由于 Excel 中的一个错误:https://superuser.com/a/776614/1084793)。如果字符串中有逗号,Shane 的答案对我来说就不起作用。

=如果测试包含换行符,我也在使用时遇到问题。

在任何一种情况下(如果它很长,或者有一个换行符),我希望 Excel 无论如何都能正确地解释它。

目前,这是我正在使用的 C# 代码:

private string content;
public String Content
{
    get
    {
        // escape double-quotes first, to get the right length of the output
        string output = content.Replace("\"", "\"\"\"\"");
        if (output.Length > 255 || content.Contains("\n"))
        {
            // just output with double-quotes ("hello")
            return "\"" + content.Replace("\"", "\"\"") + "\"";
        }
        else
        {
            // output with the equals ("=""hello""")
            return "\"=\"\"" +
                output +
                "\"\"\"";
        }
    }
    set
    {
        content = value;
    }
}

到目前为止,这种方法适用于我的所有场景。如果有人能解决换行符或 255 个字符的问题,同时仍然使用“=”方法,我会非常感兴趣。

相关内容