から複数の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:私のソリューション - 時/ベースは、私が高速です関数textscanでcsvreadを置き換え
の下にペトリコールに触発されました。それから私は私が(私の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のソリューションを受け入れました。
あなたのデータについては、以下を提供します
私は1つの方法がNaN、NaNの場合、NaNの場合、NaNのようなもので空白行を交換してからcsvreadを使用してデータをロードした後にすることであろうと仮定またはあなたがデータをループして、MATLABのブロックを非常に簡単に抽出することができます。 – Dan
私はインポート後にデータをループバックすることを避けることを望んでいました。これは、これがプロセス全体に時間を追加するだけであると仮定しています。別の言い方をすれば、私はtextscanがインポートの最速の方法であることを今までに見出しましたか? –
区切り線をまったく残さずに、新しいブロックが開始するときの行インデックスだけである2番目のファイルを作成し、このファイルを使用して、それぞれに別々の行列を作成するのではなく、作業する行範囲を定義しますか? – Dan