У меня есть файл 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.
Любая справка в том, как повредить данные в столбцы и отформатировать экспоненциальное представление, была бы большой.
Заранее спасибо.
KennyTM прав.
data = Import["data.csv", "CSV"];
column1 = data[[All,1]]
column2 = data[[All,2]]
...
Нотацию можно исправить с помощью 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 [...]
, как указано выше.
В MMA7 я использую аргумент «элементы». Фактически, я не могу импортировать даже файл .csv без указания элемента:
aa = Import ["data.csv", "Data"]
Когда вы это делаете, все строки автоматически преобразуются в выражения : Head / @ Flatten @ aa - это {Настоящее, Настоящее, ....}. Кроме того, "8.5752e-007" становится 8.5752 * 10 ^ 7, допустимым выражением MMA.
Результатом импорта является список 1xn {{...}}.
Итак, Transpose @ aa дает список nx1 {{.}, {.}, ....}.
Я думаю, что это именно тот формат, который вам нужен.
Ответ Даворака правильный, если вам нужно импортировать весь 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