MATLAB Language
大きなファイルを読む
サーチ…
テキストスキャン
大きなテキストファイルや文字列でデータをフォーマットしたとします。
Data,2015-09-16,15:41:52;781,780.000000,0.0034,2.2345
Data,2015-09-16,15:41:52;791,790.000000,0.1255,96.5948
Data,2015-09-16,15:41:52;801,800.000000,1.5123,0.0043
textscan
を使ってこれをかなり速く読むことができます。これを行うには、 fopen
使ってテキストファイルのファイル識別子を取得します。
fid = fopen('path/to/myfile');
この例のデータでは、最初の列「データ」を無視し、日付と時刻を文字列として読み込み、残りの列をdouble型として読み込みたいとします。
Data , 2015-09-16 , 15:41:52;801 , 800.000000 , 1.5123 , 0.0043
ignore string string double double double
これを行うには、以下を呼び出してください:
data = textscan(fid,'%*s %s %s %f %f %f','Delimiter',',');
%*s
のアスタリスクは、「この列を無視する」ことを意味します。 %s
は "文字列として解釈"を意味します。 %f
は "倍精度浮動小数点数として解釈"を意味します。最後に、 'Delimiter',','
は、すべてのカンマを各列間の区切り文字として解釈する必要があることを示します。
総括する:
fid = fopen('path/to/myfile');
data = textscan(fid,'%*s %s %s %f %f %f','Delimiter',',');
data
セル内の各列を含むセル配列が含まれるようになりました。
日付と時刻の文字列を数値配列に高速に変換
日付と時刻の文字列を数値配列に変換するにはdatenum
使うことができますが、大きなデータファイルを読み込む時間は半分になります。
例Textscanのデータを考えてみましょう。 textscanを使用して日付と時刻を整数として解釈することで、それらを素早く数値配列に変換することができます。
つまり、サンプルデータの行は、次のように解釈されます。
Data , 2015 - 09 - 16 , 15 : 41 : 52 ; 801 , 800.000000 , 1.5123 , 0.0043
ignore double double double double double double double double double double
これは次のように読み込まれます:
fid = fopen('path/to/myfile');
data = textscan(fid,'%*s %f %f %f %f %f %f %f %f %f %f','Delimiter',',-:;');
fclose(fid);
今:
y = data{1}; % year
m = data{2}; % month
d = data{3}; % day
H = data{4}; % hours
M = data{5}; % minutes
S = data{6}; % seconds
F = data{7}; % milliseconds
% Translation from month to days
ms = [0,31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];
n = length(y); % Number of elements
Time = zeros(n,1); % Declare numeric time array
% Algorithm for calculating numeric time array
for k = 1:n
Time(k) = y(k)*365 + ms(m(k)) + d(k) + floor(y(k)/4)...
- floor(y(k)/100) + floor(y(k)/400) + (mod(y(k),4)~=0)...
- (mod(y(k),100)~=0) + (mod(y(k),400)~=0)...
+ (H(k)*3600 + M(k)*60 + S(k) + F(k)/1000)/86400 + 1;
end
566,678要素のdatenum
を使用するには6.626570秒が必要でしたが、上記の方法では0.048334秒、すなわちdatenum
の時間の0.73%または〜137倍の時間が必要でした。
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow