2012-04-28 63 views
3

我有很多文件。每個數據都包含數據。 我可以很高興地將一個文件導入Mathematica。但有500多個文件。 我願意這樣做:Wolfram Mathematica從多個文件導入數據

Import["~/math/third_ks/mixed_matrices/1.dat", "Table"]; 
aaaa = % 
    (*OUTPUT - some data, I can access them!*) 

所有我想要的是隻是爲了圓(我能做到這一點),但我不能改變文件的名字 - 1.dat。我想改變它。

我試圖做出這樣的解決方案。我生成了一部分可能的名稱,並將它們寫入分隔文件。

Import["~/math/third_ks/mixed_matrices/generate_name_of_files.dat", "Table"]; 
aaaa = % 

輸出:{{"~/math/third_ks/mixed_matrices/0.dat"}, \
{"~/math/third_ks/mixed_matrices/1.dat"}, ......

所有我想要做的就是Table[a=Import[aaaa[[i]] ,{i,1,500}]

但功能Import只接受String 「」 對象作爲文件名/路徑。

+0

順便說一下,Mathematica特定的StackExchange站點位於http://mathematica.stackexchange.com/。你的問題會在那裏得到更快的回答,並且你可能會得到更多的讚揚! – Verbeia 2012-04-28 09:16:39

回答

4

您可以使用FileNames來收集想要導入的數據文件的名稱,並使用通常的通配符。

然後只是將Import語句映射到文件名列表上。

data將包含包含來自每個文件的數據作爲單獨元素的列表。

data = Import[#,"Table"]& /@ FileNames["~/math/third_ks/mixed_matrices/*.dat"]; 
2

如果沒有文件名稱的文件,搞清楚發生了什麼是有點困難的。不過,我認爲你可以通過在文件名列表上使用Flatten來解決你的問題,使它成爲String對象的向量,可以傳遞給Import。目前,您的列表是一個n * 1矩陣,其中每行是包含StringList,而不是String的向量。

順便提一下,在這種情況下,您可以使用Map/@)而不是Table

0

感謝您的回覆。
它發生了,所以我在同一時間得到了兩個解決方案。
我認爲忘記第二種方式是不公平的。

aaaa = "~/math/third_ks/mixed_matrices/" <> ToString[#] <> ".dat" & /@ Range[0, 116]; 
    (*This thing generates list of lines 
    Output: 
     {"~/math/third_ks/mixed_matrices/0.dat", \ 
     "~/math/third_ks/mixed_matrices/1.dat", \ 
     "~/math/third_ks/mixed_matrices/2.dat", .....etc, until 116 

    Table[Import[aaaa[[i]], "Table"], {i, 1, 117}]; 
    (*and it just imports data from file*) 

    bbbb = %; (*here we have all data, voila!*) 

順便說一下,這不是我的解決方案。 它是由我的一個朋友推測的: https://stackoverflow.com/users/1243244/light-keeper

+0

很高興你解決了你的問題:)在上面的解決方案中,沒有必要使用索引變量來構建表。所有你需要做的就是在列表aaaa上映射'/ @'Import語句(你實際上並不需要將字符串列表分配給aaaa,或者你可以映射到名稱列表上)。這是功能性程序設計優於程序性的巧妙優勢。沒有必要跟蹤有多大的事情。你只需要在列表中映射你想要的功能,並且它可以運行多久:) – 2012-04-29 13:52:23