2010-05-04 78 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