2010-05-04 79 views
4

考虑下面的2×2阵列:导入和导出CSV为在数学两个破

x = {{"a b c", "1,2,3"}, {"i \"comma-heart\" you", "i \",heart\" u, too"}} 

如果我们导出为CSV格式,然后再导入一遍,我们没有得到同样的东西回来:

Import[Export["tmp.csv", d]] 

看看tmp.csv很明显,导出不起作用,因为引号没有正确转义。

根据我假定正确地总结了Wikipedia's entry on CSVRFC,以正确的方式导出上述阵列如下:

a b c, "1,2,3" 
"i ""heart"" you", "i "",heart"" u, too" 

导入上面没有任何产生原始阵列。 因此导入也被打破。

我已将这些错误报告给[email protected],但我想知道其他人是否在此期间有解决方法。

一种解决方法是使用TSV而不是CSV。 我用TSV测试了上述内容,它似乎可以工作(即使标签嵌入到数组中)。

+0

如果这样会使你感到不安,请尝试导入[Export [“string.csv”,x,“CSV”]],这可能会毁了你的一天。抱歉。 – 2010-05-04 22:17:24

+0

@高性能标记:我尝试过,但使用明确的“CSV”参数时没有看到差异。你什么意思? – dreeves 2010-05-05 01:06:03

+1

Wolfram的回复:感谢您花时间向我们发送此报告。我已将您的示例转发给我们的开发小组。 此问题的推荐解决方案是使用不同的 格式。 对于由此问题引起的任何不便,我们深表歉意。 我收录了您的联系信息,以便在解决此问题时通知您 。 – dreeves 2010-05-05 21:18:45

回答

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格式之一,消耗臭氧层物质,HDF,HDF5,CDF,FITS等

您也可能会发现他们中的一些更快,因为他们中的一些是二进制并没有因此无从考证PA解析完成。这完全取决于您的应用程序以及Mathematica以外的文件。

+0

好主意。虽然我想我们可以编写一个带有单引号和双引号的例子,这会让你的版本和我的版本一样。 – dreeves 2010-05-05 06:21:30

+0

当然,这是变通方法的本质=)您也可以使用Mathematica支持的其他表格/科学数据格式之一,如XLS,ODS,HDF,HDF5,CDF,FITS等。您可能还会发现其中一些更快它们是二进制的,因此没有文本解析要完成。这完全取决于您的应用程序以及Mathematica以外的文件。 – 2010-05-05 15:57:01

+0

谢谢迈克尔。好主意;心存善念;睿智哲思;你应该让你的答案的一部分! – dreeves 2010-05-05 16:28:19