2016-10-14 4 views
1

Octaveを使用して実行できるようにMATLABコードを書き直そうとしていますが、textscan () 関数。Octave 4.0.3(300万行/ 250 MBファイル)でtextscan()を使用する問題

オリジナルコード(MATLAB):

function data = import_file(filename, startRow, endRow) 

delimiter = ' '; 
if nargin<=2 
    startRow = 3; 
    endRow = inf; 
end 

formatSpec = '%f%f%f%f%f%f%*s%[^\n\r]'; 

fileID = fopen(filename,'r'); 

dataArray = textscan(fileID, formatSpec, endRow(1)-startRow(1)+1, 'Delimiter', delimiter, 'MultipleDelimsAsOne', true, 'EmptyValue' ,NaN,'HeaderLines', startRow(1)-1, 'ReturnOnError', false); 
for block=2:length(startRow) 
    frewind(fileID); 
    dataArrayBlock = textscan(fileID, formatSpec, endRow(block)-startRow(block)+1, 'Delimiter', delimiter, 'MultipleDelimsAsOne', true, 'EmptyValue' ,NaN,'HeaderLines', startRow(block)-1, 'ReturnOnError', false); 
    for col=1:length(dataArray) 
     dataArray{col} = [dataArray{col};dataArrayBlock{col}]; 
    end 
end 

fclose(fileID); 

data = [dataArray{1:end-1}]; 

end 

エラー:

error: strread: %q, %c, %[] or bit width format specifier 
s are not supported yet. 
error: called from 
    strread at line 329 column 7 
    textscan at line 321 column 8 
    import_file at line 13 column 15 
    main at line 52 column 22 

サンプルデータ:

# U POINT_DATA 3711396 
# x y z U_x U_y U_z 
739263.5 9363820 172.809998 -5.34212399 -0.0408997531 0.0736143066 
739263.5 9363789 172.979996 -5.34212399 -0.0408997531 0.0736143066 
739294.312 9363820 172.449997 -5.34212399 -0.0408997531 0.0736143066 
739294.312 9363789 173.710007 -5.34212399 -0.0408997531 0.0736143066 
739325.125 9363820 170.699997 -5.248474 -0.00403332808 0.041700209 
739325.125 9363789 172.350006 -5.37227834 -0.0307070923 0.0492642202 
739355.938 9363820 168.690002 -5.248474 -0.00403332808 0.041700209 
739355.938 9363789 170.5 -5.37227834 -0.0307070923 0.0492642202 
739386.75 9363820 169.110001 -5.248474 -0.00403332808 0.041700209 
739386.75 9363789 170.839996 -5.37227834 -0.0307070923 0.0492642202 
739417.562 9363820 170.789993 -5.248474 -0.00403332808 0.041700209 
739417.562 9363789 171.820007 -5.37227834 -0.0307070923 0.0492642202 

私はすでに、このような関数dlmreadなどの他の機能を、(使用して試してみました) 、load()、さらにはfgetl()を使って作業をしていましたが、MATLABを使用していた8秒に比べて時間がかかりすぎます。

formatSpecを '%f%f%f%f%f%f'に置き換えることもできませんでした。

このファイルには、3711396行と250 MBのデータが6列のデータに分割されています。

コードを修正するのに手伝ってもらえますか?

+0

だけ使用して 'load'がオクターブでデータを読み込むための最速の方法のようになります。

私は成功しますが、以下の変更されたコードを使用して提供サンプルデータをインポートすることができました。あなたは 'data = load(filename)(startRow:endRow、:);を試しましたか? – Andy

答えて

1

私はあなたのコードを調べることができ、実行を妨げる2つの事柄があることを知りました。

最初は、第二は、「ReturnOnError」名前/値のペアを使用した、あなたにformatSpec

%[^\n\r]の使用でした。

これらの機能はどちらもOctaveではまだサポートされていません。

function data = import_file(filename, startRow, endRow) 

if nargin<=2 
    startRow = 3; 
    endRow = inf; 
end 

formatSpec = '%f%f%f%f%f%f'; 
% Corrected formatSpec to import 6 consecutive floats 

fileID = fopen(filename,'r'); 

dataArray = textscan(fileID, formatSpec, endRow(1)-startRow(1)+1,... 
    'EmptyValue' ,NaN,... 
    'HeaderLines', startRow(1)-1); 
% Removed 'ReturnOnError' as it is not yet implimented in Octave. 

for block=2:length(startRow) 
    frewind(fileID); 

    dataArrayBlock = textscan(fileID, formatSpec,... 
     endRow(block)-startRow(block)+1,... 
     'EmptyValue' ,NaN,... 
     'HeaderLines', startRow(block)-1); 

    for col=1:length(dataArray) 
     dataArray{col} = [dataArray{col};dataArrayBlock{col}]; 
    end 
end 

fclose(fileID); 

data = [dataArray{1:end}]; 
%Changed 'end-1' to 'end' to include last column. 

end 
関連する問題