Mathematica - Импортировать CSV и обработать столбцы?

У меня есть файл 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.

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

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

5
задан Nope 26 March 2010 в 17:26
поделиться

4 ответа

KennyTM прав.

data = Import["data.csv", "CSV"];
column1 = data[[All,1]]
column2 = data[[All,2]]
...
13
ответ дан 18 December 2019 в 08:27
поделиться

Нотацию можно исправить с помощью 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 [...] , как указано выше.

2
ответ дан 18 December 2019 в 08:27
поделиться

В MMA7 я использую аргумент «элементы». Фактически, я не могу импортировать даже файл .csv без указания элемента:

aa = Import ["data.csv", "Data"]

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

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

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

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

1
ответ дан 18 December 2019 в 08:27
поделиться

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

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

Оператор * ^ является эквивалентом оператора e в системе Mathematica. Обратите внимание, что это также хороший способ разделить строки в форме 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
3
ответ дан 18 December 2019 в 08:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: