2012-05-14 4 views
3

から複数の2Dアレイを読み取ります。例:MATLABは、私は4列の2Dアレイが、行の変化数を含むCSVファイルがCSVファイル

2, 354, 23, 101 
3, 1023, 43, 454 
1, 5463, 45, 7657 

4, 543, 543, 654 
3, 56, 7654, 344 

... 

私は、データの各ブロックの操作を実行できるようにデータをインポートできるようにする必要がありますが、しかしcsvreadを関数dlmreadと関数textscanすべてが空白行を無視します。

私はどこにも解決策を見つけることができないよう、どのようにこれを行うことができますか?

PS:

それは、上記の形式のファイルは、実際にデータの一ブロックのみを含む多くのファイルを連結していることは注目に値するかもしれ(私は、数千から読み取るする必要がありますする必要はありませんブロックごとの空白行は、他の区切り記号/マーカーに変更することができます。これはちょうどpythonスクリプトで行われます。

EDIT:私のソリューション - 時/ベースは、私が高速です関数textscancsvreadを置き換え

の下にペトリコールに触発されました。それから私は私が(私のPythonスクリプトを修正する)代わりに、ナンの行で空白行を交換した場合、私は二関数textscanが遅いポイントの必要性を取り除くことができることに気づきました。私のコードは:

filename = 'data.csv'; 
fid = fopen(filename); 
allData = cell2mat(textscan(fid,'%f %f %f %f','delimiter',',')); 
fclose(fid); 

nanLines = find(isnan(allData(:,1)))'; 

iEnd = (nanLines - (1:length(nanLines))); 
iStart = [1 (nanLines(1:end-1) - (0:length(nanLines)-2))]; 
nRows = iEnd - iStart + 1; 

allData(nanLines,:)=[]; 

data = mat2cell(allData, nRows); 

評価は0.28s(103000行のファイル)です。私は実際に私の最初の問題を解決するためにpetrichorのソリューションを受け入れました。

あなたのデータについては、以下を提供します
+0

私は1つの方法がNaN、NaNの場合、NaNの場合、NaNのようなもので空白行を交換してからcsvreadを使用してデータをロードした後にすることであろうと仮定またはあなたがデータをループして、MATLABのブロックを非常に簡単に抽出することができます。 – Dan

+0

私はインポート後にデータをループバックすることを避けることを望んでいました。これは、これがプロセス全体に時間を追加するだけであると仮定しています。別の言い方をすれば、私はtextscanがインポートの最速の方法であることを今までに見出しましたか? –

+0

区切り線をまったく残さずに、新しいブロックが開始するときの行インデックスだけである2番目のファイルを作成し、このファイルを使用して、それぞれに別々の行列を作成するのではなく、作業する行範囲を定義しますか? – Dan

答えて

1
filename = 'data.txt'; 

%# Read all the data 
allData = csvread(filename); 

%# Compute the empty line indices 
fid = fopen(filename); 
lines = textscan(fid, '%s', 'Delimiter', '\n'); 
fclose(fid); 
blankLines = find(cellfun('isempty', lines{1}))'; 

%# Find the indices to separate data into cells from the whole matrix 
iEnd = [blankLines - (1:length(blankLines)) size(allData,1)]; 
iStart = [1 (blankLines - (0:length(blankLines)-1))]; 
nRows = iEnd - iStart + 1; 

%# Put the data into cells 
data = mat2cell(allData, nRows) 

data = 

    [3x4 double] 
    [2x4 double] 
+1

ありがとうございました。上記の私のコメントで述べたように、私はデータをループバックすることを避けたいと思っていましたが、あなたのソリューションは良い中間地を提供します。私の実際のデータのタイミング:私はcsvreadが0.46秒かかりますが、textscanは0.26しか必要としません。したがって、私がcsvreadをtextscanに置き換えたときの解決方法は合計0.49秒しかかかりません。私はまだ「一歩」の方法があるのか​​どうか、興味があります...多くのありがとう –

関連する問題