0

次のような巨大な csv ファイルがあります。

0, "24 44 43 51......"
1, "99 81 34 58......"

ドットは、各行のより多くの数字を表します。各行にはシリアル番号があります。0、1、2... および対応する数字 (1000 前後)。このファイルには 1000 行以上あります。次のような行と列で構成されるマトリックスでこのファイルを読み取る方法はありますか?

0 24 44 43 51......(more data)
1 99 81 34 58......(more data)
.
.
.

試してみtdfreadましたが、読むのに時間がかかりすぎて断念しました。どんな助けでも大歓迎です。

4

2 に答える 2

2

そのような場合に私がお勧めする一般的なアプローチは次のとおりです。

  1. 行を読み上げます (たとえば、textscan)。
  2. 区切り文字をスペースに置き換えます (たとえば、regexprep)
  3. 各行に適用str2numして数値を抽出します。

サンプルコードは次のとおりです。

fid = fopen(filename, 'r');
C = textscan(fid, '%s', 'Delimiter', '');
C = cellfun(@str2num, regexprep(C{:}, '[",]', ' '), 'UniformOutput', false);
fclose(fid);

結果は、数値ベクトルの cell 配列で、1 行に 1 つのベクトルです。すべてのベクトルが同じ数の要素をもつ場合、次のように cell 配列を行列に変換できます。

M = vertcat(C{:});

代替ソリューション

事前に 1 行あたりの値の数がわかっている場合 (それを としNます)、より短い構文を使用できます。

fid = fopen(filename, 'r');
C = textscan(fid, repmat('%f', 1, N), 'Delimiter', '", \b\t', 'MultipleDelimsAsOne', true);
fclose(fid);
M = [C{:}];
于 2013-05-20T13:57:09.317 に答える
0

これはうまくいくはずです:

>> n = 2;    % The number of lines; 1000 in your case.
>> A = textread('test1.txt','%d','delimiter',', "','emptyvalue',0);
>> B = reshape(A,uint64(numel(A)/n),n)';
>> B = B(:,[1, 3:end]);

test1.txtの入力の場合:

0, "24 44 43 51"
1, "99 81 34 58"

結果は次のとおりです。

>> B

B =

     0    24    44    43    51
     1    99    81    34    58
于 2013-05-20T14:12:28.160 に答える