在Mathematica中,CSV的导入和导出都已中断

时间:2010-05-04 21:02:19

标签: arrays file file-io csv wolfram-mathematica

考虑以下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测试了上面的内容,它似乎工作(即使在数组的条目中嵌入了选项卡)。

1 个答案:

答案 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 / ExportImportString / ExportString采用相同的选项,后者只是读取/写入字符串而不是文件。

您还可以使用Mathematica支持的其他表格/科学数据格式,如XLS,ODS,HDF,HDF5,CDF,FITS等。

您可能还会发现其中一些更快,因为其中一些是二进制的,因此无法进行文本解析。这一切都取决于您的应用程序以及在Mathematica之外使用的文件。