对以逗号分隔的CSV进行格式化,以迫使Excel将其解释为一个字符串。
我一直在寻找一段时间,试图找出如何以这样的方式输出CSV文件,迫使Excel将值解释为字符串,而不是试图将它们转换为数字或日期。
例如:
"141", "10/11/2002", "350.00", "1311742251"
。
0x1&
Excel试图 “智能地 "将这些值转换成它的本地日期/数字格式。有什么方法可以解决这个问题吗?
_EDIT: 澄清了我的问题的意图,抱歉造成了混淆。
我一直在寻找一段时间,试图找出如何以这样的方式输出CSV文件,迫使Excel将值解释为字符串,而不是试图将它们转换为数字或日期。
例如:
"141", "10/11/2002", "350.00", "1311742251"
。
0x1&
Excel试图 “智能地 "将这些值转换成它的本地日期/数字格式。有什么方法可以解决这个问题吗?
_EDIT: 澄清了我的问题的意图,抱歉造成了混淆。
对于那些控制源数据的人来说,显然Excel会自动检测CSV字段的格式,除非CSV列是这种格式。
"=""Data Here"""
例如…
20, 5.5%, "0404 123 351", "3-6", "=""123"""
[number] [percent] [number] [date] [string] <-- how Excel interprets
这在Google Spreadsheet中也适用,但不知道其他电子表格应用程序是否支持这种格式。
如果你怀疑任何数据本身可能包含引号,你需要对它们进行双转义,就像这样……
"=""She said """"Hello"""" to him"""
(编辑:更新了更正,感谢DMA57361!)
和许多人一样,我一直在为微软做出的相同决定而苦恼,并尝试了各种建议的解决方案。
对于Excel 2007来说,下面的内容。
然而:
在所有值前加一个制表符,然后再在它们周围加双引号,这样可以防止转换为日期,也可以防止修剪前导或尾部的零,而且工作表甚至不会在每个单元格的左上角显示讨厌的警告标记。
E.g:
"<tab character><some value>","<tab character><some other value>"
请注意制表符必须在双引号之内 编辑:原来双引号根本不需要。
双击csv文件,可以在Excel中以电子表格的形式打开该文件,显示所有的数值,这些数值就像文本数据一样,就像上面的处理一样。一定要设置Excel使用‘.’作为小数点,而不是‘,’,否则csv文件的每一行最终都会在每行的第一个单元格中变成一个文本。显然微软认为CSV的意思是 “不是小数点 "Separated Value。
Simon的例子对我来说并不适用,我怀疑这是语言的差异。在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);
这是输出文件的样子:
="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,=""
可以看到,输出文件的格式是="VALUE",
而不是"=""VALUE""",
,我相信这可能是Visual Basic的惯例。
我使用的是Excel 2010。顺便说一下,Google Sheets不会打开/转换这样格式的文件。如果你去掉等号,这样"VALUE",
就可以工作了,Excel仍然会打开文件,但会忽略你希望你的列是字符串这一事实。
强制Excel将日期解释为文本的一个简单方法是在日期前面加上一个单引号,而不是使用全引号,如:'10/11/2002
‘。
'10/11/2002
如果你能导入CSV而不是打开它,你可以告诉Excel每一列应该是什么格式。看看【这个问题我问了】(https://superuser.com/questions/497367/how-to-force-excel-to-treat-dates-in-csv-as-text-in-a-macro)。