2010-03-26 1 views
4

У меня есть файл CSV, который отформатирован как:Mathematica - импортировать 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 не принимает научные обозначения в th e form 8.5e-007.

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

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

+3

Какая версия Mathematica вы используете? Mathematica 7 отлично работает для меня. Также попробуйте использовать 'Импорт [" data.csv "," CSV "]'. – kennytm

ответ

12

KennyTM является правильным.

data = Import["data.csv", "CSV"]; 
column1 = data[[All,1]] 
column2 = data[[All,2]] 
... 
+1

Вот документация для 'Импорт [...," CSV "]': http://reference.wolfram.com/mathematica/ref/format/CSV.html –

+0

Обратите внимание, что это не сработает, если каждый строка данных имеет дополнительный нумерационный столбец, такой как: ТВ, радио, газета, продажи \ n 1,230,1,37.8,69.2,22.1 \ n 2,44.5,39.3,45.1,10.4 \ n –

2

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

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

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

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

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

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

с ToExpression[...], как описано выше.

2

Davorak's answer является правильным, если вам нужно импортировать весь 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 
1

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

аа = Импорт [ «data.csv», «Data»]

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

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

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

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

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