考虑以下2乘2阵列:
x = {{"a b c", "1,2,3"}, {"i \"comma-heart\" you", "i \",heart\" u, too"}}
如果我们将其导出为CSV然后再次导入它,我们就不会得到同样的结果:
Import[Export["tmp.csv", d]]
看看tmp.csv很明显导出没有用,因为引号没有正确转义。
根据我在RFC上正确总结的Wikipedia's entry on CSV,导出上述数组的正确方法如下:
a b c, "1,2,3"
"i ""heart"" you", "i "",heart"" u, too"
导入上述内容也不会产生原始数组。 所以导入也被打破了。
我已经向support@wolfram.com报告了这些错误,但我想知道其他人是否同时有解决方法。
一种解决方法是仅使用TSV而不是CSV。 我用TSV测试了上面的内容,它似乎工作(即使在数组的条目中嵌入了选项卡)。
答案 0 :(得分:2)
另一种解决方法是使用不同的分隔符而不是TSV:
In[26]:= str = ExportString[x, "CSV", "TextDelimiters"->"'"];
Out[26]= "'a b c','1,2,3'
'i \"comma-heart\" you','i \",heart\" u, too'"
In[27]:= y = ImportString[str, "CSV", "TextDelimiters"->"'"]
Out[27]= {{"a b c", "1,2,3"}, {"i \"comma-heart\" you", "i \",heart\" u, too"}}
In[28]:= x == y
Out[28]= True
请注意,Import
/ Export
和ImportString
/ ExportString
采用相同的选项,后者只是读取/写入字符串而不是文件。
您还可以使用Mathematica支持的其他表格/科学数据格式,如XLS,ODS,HDF,HDF5,CDF,FITS等。
您可能还会发现其中一些更快,因为其中一些是二进制的,因此无法进行文本解析。这一切都取决于您的应用程序以及在Mathematica之外使用的文件。