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}}

どちらの場合も、回答は追加レベルのリスト構造にまとめられます。これは非常に簡単に処理できます。ただし、数字が1つしかない、または必要であることが本当に確実な場合は、文字列をストリームに変換して、を使用できます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の代わりにデータ配列全体を配置して、1つのライナーで一度に処理できます

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

上記のToExpression[...]ように。

于 2010-03-26T20:25:10.100 に答える
2

MMA7では、「elements」引数を使用します。実際、要素を指定せずに.csvファイルをインポートすることはできません。

aa = Import ["data.csv"、 "Data"]

これを行うと、すべての文字列が自動的に式に変換されます。Head/ @ Flatten @ aaは{Real、Real、....}です。また、「8.5752e-007」は、合法的なMMA表現である8.5752 * 10^7になります。

インポートの結果は、1xnリスト{{...}}です。

したがって、Transpose @ aaはnx1リスト{{。}、{。}、....}を提供します。

これがあなたが望んでいたフォーマットだと思います。

于 2010-03-30T04:40:25.207 に答える