0

私は巨大な csv ファイル (例: 数ギグ以上) を持っており、Matlab でそれを読み込んで各ファイルを処理したいと考えています。ファイル全体を読み取ることは不可能なので、次のコードを使用して各行を読み取ります。

fileName = 'input.txt';
inputfile = fopen(fileName);

while 1
    tline = fgetl(inputfile);
    if ~ischar(tline)
        break
    end
end
fclose(inputfile); 

これにより、行が文字列であるサイズ (1,1) のセル配列が得られます。私が望むのは、このセルを数字だけの通常の配列に変換することです。例えば:

input.csv:
0.0,0.0,3.201,0.192
2.0,3.56,0.0,1.192
0.223,0.13,3.201,4.018

最初の行の Matlab での最終結果:

A = [0.0,0.0,3.201,0.192]

double(tline) で tline を変換しようとしましたが、これはまったく異なる結果をもたらします。また、正規表現を使用しようとしましたが、そこで立ち往生しました。すべての値を 1 つの配列の別のセルに分割するところまで来ました。しかし、str2double で double に変換すると NaN しか得られません...

任意のヒント?ファイル全体を読み取るにはすでに時間がかかるため、ループがないことが望ましいです。

4

2 に答える 2

3

あなたは探しているstr2num

>> A = '0.0,0.0,3.201,0.192';
>> str2num(A)
ans =
     0  0  3.2010  0.1920
>> A = '0.0 0.0 3.201 0.192';
>> str2num(A)
ans =
     0  0  3.2010  0.1920
>> A = '0.0     0.0 ,    3.201 , 0.192';
>> str2num(A)
ans =
     0  0  3.2010  0.1920

たとえば、入力形式にはまったく依存しません。

ただし、ユースケースではこれをお勧めしません。あなたの問題のために、私はやります

C = dlmread('input.txt',',', [1 1 1 inf]) % for first line
C = dlmread('input.txt',',')              % for entire file

また

[a,b,c,d] = textread('input.txt','%f,%f,%f,%f',1) % for first line
[a,b,c,d] = textread('input.txt','%f,%f,%f,%f')   % for entire file

すべての列を別々の変数に入れたい場合:

a = 0
b = 0
c = 3.201
d = 0.192

また

fid = fopen('input.txt','r');
C = textscan(fid, '%f %f %f %f', 1); % for first line only
C = textscan(fid, '%f %f %f %f', N); % for first N lines
C = textscan(fid, '%f %f %f %f', 1, 'headerlines', N-1); % for Nth line only
fclose(fid);

これらはすべて、はるかに簡単に拡張できます(このようなものは、何であれ、時間の経過とともに大きくなる傾向があります:)。特にdlmread、ほとんどのデータセットで非常に一般的な空の行、値の欠落、およびその他の大きな煩わしさのために、独自の句を作成するよりもエラーが発生しにくくなります。

于 2012-10-15T17:41:25.467 に答える
0

試す

data = dlmread('input.txt',',')

それはあなたがやりたいことを正確に行います。

それでも文字列をベクトルに変換したい場合:

line_data = sscanf(line,'%g,',inf)

このコードは、コマで区切られた文字列全体を読み取り、各数値を変換します。

于 2012-10-15T17:17:47.427 に答える