Mathematica - 导入CSV和流程列?

时间:2010-03-26 17:26:16

标签: csv wolfram-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也不接受8.5e-007格式的科学记数法。

如何将数据分成列并格式化科学记数法的任何帮助都会很棒。

提前致谢。

4 个答案:

答案 0 :(得分:12)

KennyTM是正确的。

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

答案 1 :(得分:3)

如果您需要将整个CSV文件作为数组导入,则

Davorak's answer是正确的。但是,如果您需要从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 :(得分: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[...]

答案 3 :(得分:1)

在MMA7中,我使用“elements”参数。事实上,如果不指定元素,我甚至无法导入.csv文件:

AA =导入[ “data.csv”, “数据”]

执行此操作时,所有字符串都会自动转换为表达式:Head / @ Flatten @ aa是{Real,Real,....}。此外,“8.5752e-007”变为8.5752 * 10 ^ 7,合法的MMA表达式。

导入的结果是1xn列表{{...}}。

所以,Transpose @ aa给出了nx1列表{{。},{。},....}。

我认为这是你想要的格式。