2017-02-03 6 views
0

列を追加するのではなく、科学データの「スタック」値から奇妙にフォーマットされたCSVファイルがあります。たとえば:CSVを複数の列に分割して再フォーマットする

Parameter : Collision Energy (CE), 
Mass = 174, 
Max XY = 43,9242 

Raw Data : 

0,260 
1,268 
2,291 
3,327 
4,366 
5,405 
Mass = 195, 
Max XY = 38,11302 

Raw Data : 

0,478 
1,498 
2,560 
3,620 
4,707 
5,777 
Mass = 236, 
Max XY = 32,1447 

Raw Data : 

0,96 
1,100 
2,108 
3,115 
4,122 
5,129 

代わりに、私は次のようなデータを再編成う関数を記述したいと思います:

Mass = 174  Mass = 195  Mass = 236 
    Max XY = 43,9242 Max XY = 38,11302 Max XY = 38,11302 
0 260    478    96 
1 268    498    100 
2 291    560    108 
3 327    620    115 
4 366    707    122 
5 405    777    129 

私は非常に遠くもらっていないが、これまでのところ、私が読みましたファイルとしてテーブルに格納し、テーブルをセルに変換します。私は文字列 'Mass'を検索し、2つのインデックスの間に新しい列にデータを格納するために、セル上の論理的なインデックスを使用したいが、動作しませんでした。

私が持っているもう1つのアイデアは、文字列 'Mass'の行ごとに読むことです。真の場合 - >対応する列を格納する2.ファイルの最後まで繰り返す。

どのように私はエレガントに私は(完全なコードを期待していないアイデアを探して)を読むことは簡単に行うことができますか?

答えて

0

regular expressionsを使用して、さまざまなデータ型を読み取ることができます。最初fileread関数を使って文字列にcsvファイルを読む:

filetext = fileread('data.csv'); 

その後、我々は、個々のフィールドを探すことができます。生データの

c_max = regexp(filetext, 'Max XY =[\ ]*([\d]+,[\d]+)', 'tokens'); 
v_max = str2num(char([c_max{:}])); 
% [43  9242;   38  11302;   32  1447] 

そして最後に:これは読み取るだろう

c_raw = regexp(filetext, '\n([\d]+,[\d]+)', 'tokens'); 
v_raw = str2num(char([c_raw{:}])); 

注最大XYため、

同様
% read the matching tokens into a cell array 
c_mass = regexp(filetext, 'Mass =[\ ]*([\d]+)', 'tokens'); 

% convert the cell array to characters and then interpret as numbers 
v_mass = str2num(char([c_mass{:}])); 
% [174 195 236] 

:例えば、質量のための番号はとして抽出することができます生データ全体を2つの列に変換します。しかし、簡単にreshapeそれは様々なブロックを分離することができます。

+0

お返事ありがとうございました。少なくとも、より簡単に再構成するためにデータを解析するのに役立ちました。正規表現関数のためのMATLABドキュメント以外のリソースはありますか?私はいつもこれを利用する方法を学ぼうとしましたが、私は本当にフォーマットを理解していません。私のMatlab教育はVanderbilt MATLABコースで行われましたが、このようなテキストを解析する方法を教えるのは非常にうまくいきません。 –

+0

もっと良いリソースがあると確信していますが、正規表現についての私の知識は、主にMatlabのドキュメンテーションといくつかの試行錯誤から来ています。 Matlabのマニュアルページの例に従えば、始めるのが悪い場所ではありません。 – aksadv

関連する問題