2012-04-28 5 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

Кстати, сайт StackExchange, специфичный для Mathematica, находится по адресу http://mathematica.stackexchange.com/. На ваши вопросы ответят быстрее, и, вероятно, вы получите больше бонусов! – Verbeia

ответ

4

Вы можете использовать FileNames для сбора имен файлов данных, которые вы хотите импортировать, с помощью обычных подстановочных знаков.

А затем просто нарисуйте заявление Import над списком имен файлов.

data затем будет содержать список, содержащий данные из каждого файла в виде отдельного элемента.

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

Немного сложно разобраться, что происходит без файла с именами файлов. Однако, я думаю, вы могли бы решить свою проблему, используя Flatten в списке имен файлов, чтобы сделать его вектором String объектов, которые могут быть переданы Import. В настоящее время ваш список представляет собой матрицу n * 1, где каждая строка - List, содержащая String, а не вектор String s.

Кстати, вы можете использовать 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

Рад, что вы решили свою проблему :) В приведенном выше решении нет необходимости создавать таблицу с индексной переменной. Все, что вам нужно сделать, это map '/ @' оператор Import в списке aaaa (вам фактически не нужно назначать список строк для aaaa, либо вы можете просто сопоставить список имен). Это опрятное преимущество функционального программирования над процедурным. Не нужно отслеживать, насколько велики вещи. Вы просто сопоставляете функцию, которую вы хотите по списку, и она работает, как долго это происходит :) –

Смежные вопросы