Arrays 在Mathematica中,CSV的导入和导出都已中断
考虑以下2×2阵列:Arrays 在Mathematica中,CSV的导入和导出都已中断,arrays,file,file-io,csv,wolfram-mathematica,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,很明显导出不起作用,因为引号没有正确转义 根据正确总结的,导出上述数组的正确方法如下: a b c, "1,2,3" "i ""heart"" you", "i "",heart""
x = {{"a b c", "1,2,3"}, {"i \"comma-heart\" you", "i \",heart\" u, too"}}
如果我们将其导出为CSV,然后再次导入,则不会返回相同的内容:
Import[Export["tmp.csv", d]]
查看tmp.csv,很明显导出不起作用,因为引号没有正确转义
根据正确总结的,导出上述数组的正确方法如下:
a b c, "1,2,3"
"i ""heart"" you", "i "",heart"" u, too"
导入上述内容也不会生成原始数组。
因此,进口也被打破
我已经将这些bug报告给了support@wolfram.com但我想知道其他人是否同时有变通办法
一种解决方法是只使用TSV而不是CSV。
我用TSV测试了上述内容,它似乎可以工作(即使在数组条目中嵌入了制表符)。另一个解决方法是使用不同的分隔符,而不是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
请注意,导入
/导出
和导入字符串
/导出字符串
采用相同的选项,后者的功能只是读取/写入字符串而不是文件
您还可以使用Mathematica支持的其他表格/科学数据格式,如XLS、ODS、HDF、HDF5、CDF、FITS等
- (Wolfram数据交换格式)
您还可能会发现其中一些更快,因为其中一些是二进制的,因此不需要进行文本解析。这完全取决于您的应用程序以及该文件在Mathematica之外的用途。如果这让您感到不安,请尝试导入[Export[“string.csv”,x,“csv”]],这可能会毁了您的一天。抱歉。@High Performance Mark:我试过了,但在使用显式“CSV”参数时没有发现任何区别。你是什么意思?Wolfram的回复:谢谢你花时间给我们发送这份报告。我已将您的示例转发给我们的开发小组。此问题的建议解决方案是使用不同的格式。对于由此问题造成的不便,我们深表歉意。我包含了您的联系信息,以便在解决此问题时通知您。顺便说一句。仍然存在于Mathematica 10中。快6年了!好主意。虽然我想我们可以用转义单引号和双引号来编造一个例子,这会使你的版本和我的版本以同样的方式崩溃;这就是变通方法的本质=)您还可以使用Mathematica支持的其他表格/科学数据格式之一,如XLS、ODS、HDF、HDF5、CDF、FITS等。您可能会发现其中一些格式更快,因为其中一些是二进制的,因此不需要进行文本解析。这完全取决于您的应用程序以及该文件在Mathematica之外的用途。谢谢Michael。好的想法;你应该把这部分作为你答案的一部分!