7

我有一个格式如下的 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

4 回答 4

15

KennyTM 是正确的。

data = Import["data.csv", "CSV"];
column1 = data[[All,1]]
column2 = data[[All,2]]
...
于 2010-03-26T18:48:49.507 回答
4

如果您需要将整个 CSV 文件作为数组导入,则Davorak 的答案是正确的。但是,如果您需要从 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
于 2010-03-29T13:30:05.677 回答
3

您可以使用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[...]同上。

于 2010-03-26T20:25:10.100 回答
2

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

aa=导入["data.csv","数据"]

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

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

因此,Transpose@aa 给出了 nx1 列表 {{.},{.}, .... }。

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

于 2010-03-30T04:40:25.207 回答