我有一个格式为:
的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格式的科学记数法。
如何将数据分成列并格式化科学记数法的任何帮助都会很棒。
提前致谢。
答案 0 :(得分:12)
KennyTM是正确的。
data = Import["data.csv", "CSV"];
column1 = data[[All,1]]
column2 = data[[All,2]]
...
答案 1 :(得分:3)
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列表{{。},{。},....}。
我认为这是你想要的格式。