Mathematica - импортировать CSV и обрабатывать столбцы? - PullRequest
5 голосов
/ 26 марта 2010

У меня есть файл CSV, отформатированный как:

0.0023709,8.5752e-007,4.847e-008

и я хотел бы импортировать его в Mathematica, а затем разделить каждый столбец на список, чтобы я мог выполнить некоторые математические операции для выбранного столбца.

Я знаю, что могу импортировать данные с помощью:

Import["data.csv"]

тогда я могу разделить столбцы следующим образом:

StringSplit[data[[1, 1]], ","]

, что дает:

{"0.0023709", "8.5752e-007", "4.847e-008"}

Проблема сейчас в том, что я не знаю, как получить данные в отдельные списки, а также Mathematica не принимает научную запись в форме 8.5e-007.

Любая помощь в том, как разбить данные на столбцы и отформатировать научную запись, была бы полезной.

Заранее спасибо.

Ответы [ 4 ]

12 голосов
/ 26 марта 2010

KennyTM верен.

data = Import["data.csv", "CSV"];
column1 = data[[All,1]]
column2 = data[[All,2]]
...
3 голосов
/ 29 марта 2010

Ответ Даворака является правильным, если вам нужно импортировать весь CSV-файл в виде массива. Однако, если у вас есть единственная строка, которую нужно преобразовать из экспоненциальной нотации в стиле C / Fortran, вы можете использовать ImportString с другими аргументами для формата. Например, есть

In[1]:= ImportString["1.0e6", "List"]
Out[1]= {1.*^6}

Оператор *^ является эквивалентом Mathematica e. Обратите внимание, что это также хороший способ разделения строк в форме CSV:

In[2]:= ImportString["1.0e6,3.2,foo", "CSV"] 
Out[2]= {{1.*10^6,3.2,foo}}

В обоих случаях вы получите свой ответ в виде дополнительного уровня структуры списка, с которым довольно легко справиться. Однако, если вы действительно уверены, что имеете или хотите использовать только одно число, вы можете превратить строку в поток и использовать Read. Это достаточно громоздко, чтобы я придерживался ImportString, однако:

In[3]:= Module[{stream = StringToStream["1.0e6"], number},
          number = Read[stream, "Number"];
          Close[stream];
          number]
Out[3]= 1.*10^6
2 голосов
/ 26 марта 2010

Вы можете исправить обозначения, используя StringReplace[].

In[1]: aa = {"0.0023709", "8.5752e-007", "4.847e-008"};

In[2]: ToExpression[
          StringReplace[
             #,
             RegularExpression@"(^\d+\.\d+)e([+-]\d+)" -> "$1*10^$2"
          ]
       ] & @ aa

Out[2]: {0.0023709, 8.5752*10^-7, 4.847*10^-8}

Вы можете поместить весь массив данных вместо aa для обработки всего сразу с одним вкладышем

{col1,col2,col3} = ToExpression[...] & @ Transpose[Import["data.csv", "CSV"]];

с ToExpression[...], как указано выше.

1 голос
/ 30 марта 2010

В MMA7 я использую аргумент "elements". На самом деле, я не могу импортировать даже файл .csv без указания элемента:

аа = Import [ "data.csv", "Данные"]

Когда вы делаете это, все строки автоматически преобразуются в выражения: Head / @ Flatten @ aa is {Real, Real, ....}. Также, 8.5752e-007 становится 8.5752 * 10 ^ 7, допустимым выражением MMA.

Результатом импорта является список 1xn {{...}}.

Итак, Transpose @ aa выдает список nx1 {{.}, {.}, ....}.

Я думаю, что это формат, который вы хотели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...