2011-06-30 78 views
2

我想知道是否有人知道如何從MATLAB中的文件中打開並讀取文件,從文件末尾開始讀取。該文件不斷更新(以讀取之間的非恆定速率),我想每次讀取文件的最後六行。從MATLAB開始讀取文件

我還將包括一個測試來驗證我不重複讀取相同的行兩次。每一行的格式如下(每個變量是一個浮點數):

timestamp accx accy accz gyrox gyroy gyroz magx magy magz 

我試圖用FSEEK,在位置改變到文件的最後一行,但這隻能讓我讀我認爲文件的最後一行,除非指定了一定數量的字節,否則我不知道字節數。

回答

1

如果您使用的是基於Unix的系統(Linux/Mac),則可以直接使用系統命令來執行所需操作。下面是一個示例測試文件:

12345 accx accy accz gyrox gyroy gyroz magx magy magz 
23456 accx accy accz gyrox gyroy gyroz magx magy magz 
34567 accx accy accz gyrox gyroy gyroz magx magy magz 
45678 accx accy accz gyrox gyroy gyroz magx magy magz 
56789 accx accy accz gyrox gyroy gyroz magx magy magz 
67890 accx accy accz gyrox gyroy gyroz magx magy magz 

您可以在UNIX和到MATLAB直接使用system命令使用tail閱讀。

[~, str]=system('tail -n 2 filename') 
str = 

    56789 accx accy accz gyrox gyroy gyroz magx magy magz 
    67890 accx accy accz gyrox gyroy gyroz magx magy magz 

你想要多少以往任何時候都行讀取更換2-n 2

接下來,爲了確保您閱讀同一行,您可能需要存儲時間戳(第一列)。要做到這一點,最簡單的方式再次讓UNIX爲你做它

[~, timestamp]=system('tail -n 2 filename | awk ''{print $1}''') 

timestamp = 

56789 
67890 

將其轉換爲使用str2num號碼和存儲這些你每次讀取,然後使用功能ismember以檢查是否有新的時間戳已經是一部分你以前讀過的時間戳。

0

要知道你從一個文件中讀取什麼行的唯一方法是從頭開始計算換行符。沒有辦法在文件末尾開始並直接向後尋找一定數量的行。

您可以編寫一個函數,從文件尾部向後讀取,直到看到N個換行符,然後輸出該塊。這正是tail的工作原理。下面是從GNU tail.c評論:

/* Print the last N_LINES lines from the end of file FD. 
    Go backward through the file, reading `BUFSIZ' bytes at a time (except 
    probably the first), until we hit the start of the file or have 
    read NUMBER newlines. 
    START_POS is the starting position of the read pointer for the file 
    associated with FD (may be nonzero). 
    END_POS is the file offset of EOF (one larger than offset of last byte). 
    Return true if successful. */ 

如果該文件是不是太龐大,最容易做的事情是寫一個函數,一次讀取一條線,只保留最後N行。

0

您可以搜索文件的最後一部分(使用fseek()在6行之前設置EOF的位置,然後搜索最後6或7個換行字符並使用find()。然後您可以提取您的數據,因爲您知道最後6行是在您讀取的原始塊中的哪個。

fid=fopen(filename,'r'); 
fseek(fid,500,'eof'); 
dat=fread(fid,Inf,'*char'); 
linestart=find(dat=="\n",7,'last'); % choose 7 newlines because there will be one at the end?