2014-12-21 74 views
1

文件的快速閱讀我一種具有fscanf和閱讀與結構化數據文件的時間表現的沮喪。我想讀一個.txt文件,其中每行有三項:DOUBLE雙長雙,我只是想讀第N個條目。不幸的是,fscanf很慢。你知道更快的方法嗎?Matlab的:有許多行(%d%d%ld)的

順便說一句,我知道的幾個主題關於這個主題在這裏,例如this question。但是,答案在我的情況下沒有幫助,因爲我已經使用fscanf

我的代碼是:

formatSpec='%d %d %ld'; % important: last one is long-double to support 64bit values! 
    sizeA=[3 100000]; 
    file1=fopen('file1.txt','r'); 
     [content,cc]=fscanf(file1,formatSpec,sizeA);   
    fclose(file1); 

你知道有更巧妙的構思與給定結構讀取文件的N行?謝謝!

編輯:file1.txt的filecontent看起來像這樣:

1 1 204378259709308 
0 1 204378259782523 
1 1 204378260105693 
3 1 204378260381676 
3 1 204378260854931 
1 1 204378261349990 
1 1 204378262189528 
0 1 204378263067715 
1 1 204378263301204 
1 1 204378263676471 
1 1 204378263771064 
1 1 204378264565420 
0 1 204378264608240 
0 1 204378264973698 
... 
3 1 205260543966542 

所以basicly: A [空間] [空間] B [空間]Ç 與A和B是[0,9]並且C是64位整數

+0

'%D'是小數,而不是增加一倍。讀取前N個字符很慢,因爲解析器必須解析整行才能找到EOL。使用matfiles或類似的會快得多。你能上傳一個例子嗎?如果所有生產線具有相同的長度或類似長度,則可以提高速度。 – Daniel

+0

我添加了一個文件的例子。最後一個條目的字符數很可能保持不變。可以幫助嗎? – NicoDean

+0

您是否嘗試過'sizeA = 100000'?在閱讀格式中已經有3個值被讀取,我認爲你不需要在'fscanf'中重複這些信息。否則,您可能會讀取比您需要的更多值,並迫使Matlab以非matlab優化的方式組織它們。 – Hoki

回答

2

你可以使用textscan這裏讀第一N項,按理說它是非常快的MATLAB的最新版本 -

fid = fopen(inputfile);    %// inputfile is the path to the input text file 
C = textscan(fid, '%d %d %d64',N); %// N is the number of first entries to be read 
fclose(fid); 

%// Get data into three separate variables (if needed) 
col1 = C{:,1}; 
col2 = C{:,2}; 
col3 = C{:,3}; 
+0

不錯,這給了我四倍的加速。當我用fscanf的方法需要28秒時,你的方法需要7秒。謝謝! (我等了幾天,也許有人想出了更快的方法,如果沒有,我會接受你的答案當然。) – NicoDean

+0

@NicoDean哇,真的很棒!等待很好,沒有趕上那裏。 – Divakar

0
% To read all the rows and columns 
T = dlmread('file1.txt',' '); 

% To read specific rows and columns 
% R1 - First row to read 
% C1 - First column to read 
% R2 - First row to read 
% C2 - First column to read 
% First row or column index is 0 

% Following is the code to read rows 3, 4 and 5 
T = dlmread('file1.txt',' ',[2 0 4 2]); 

默認情況下,它將以double讀取。

要獲得整數值

A = uint8(T(:,1)); 
B = uint8(T(:,2)); 
C = uint64(T(:,3)); 

希望這有助於:)

+0

你知道dlmread是否比fscanf(上面給出的代碼)更快嗎?這將是偉大的事情。而且,正如我所提到的,第三項是長雙。 – NicoDean

+0

dlmread不會比fscanf更快。但是,對於讀取N行而不僅僅是前N行非常有用。順便說一句,我沒有找到long-double數據類型,但double在你上面給出的示例文件中正確讀取數據。 – arccoder

+0

好的,所以我的問題是比上面的代碼更快的解決方案。 (讀N行可能也可以用'frewind'或者一些指針改變器來實現) – NicoDean

相關問題