3

4 列の 2 次元配列を含むが行数が異なる csv ファイルがあります。例えば:

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

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

...

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

どこにも解決策が見つからないようです。どうすれば解決できますか?

PS:

上記の形式のファイルは、実際には 1 ブロックのデータのみを含む多くのファイルを連結したものであることに注意してください (毎回何千ものファイルから読み取る必要はありません)。したがって、ブロック間の空白行は他の区切り文字/マーカーに変更されました。これは、Python スクリプトを使用して行うだけです。

編集:私の解決策 - 以下のペトリコールに基づいて/触発されました

csvreadをより高速なtextscanに置き換えました。次に、代わりに空白行を nan の行に置き換えると (Python スクリプトを変更すると) 、スローポイントで 2 回目のテキストスキャンを行う必要がなくなることに気付きました。私のコードは次のとおりです。

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.28 秒で評価されます (わずか 103000 行のファイル)。ペトリコールのソリューションは、最初の問題を実際に最もよく解決するため、受け入れました。

4

1 に答える 1

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]
于 2012-05-14T09:51:18.893 に答える