在MATLAB中从末尾开始读取文件

时间:2011-06-30 23:51:03

标签: matlab file-io eof tail fseek

我想知道是否有人知道如何在MATLAB中打开和读取文件,从文件末尾开始读取。该文件不断更新(读取之间的某些非恒定速率),我想每次读取文件的最后六行。

我还要包含一个测试,以验证我没有重读两次相同的行。每行的格式如下(每个变量都是浮点数):

timestamp accx accy accz gyrox gyroy gyroz magx magy magz

我试图使用fseek,将位置更改为文件的最后一行,但这只允许我读取我认为的文件的最后一行,而不是向后读取文件,除非我指定一定数量的字节,我不知道确切的字节数。

3 个答案:

答案 0 :(得分: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

您可以使用tail在unix上直接使用system命令将其读入MATLAB。

[~, 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检查新时间戳是否已经是先前读取时间戳的一部分。

答案 1 :(得分: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行。

答案 2 :(得分:0)

您可以搜索文件的结束块(使用fseek()在6行之前设置EOF的位置,然后搜索最后6或7个换行符并使用{{1}然后你可以提取你的数据,因为你知道你读过的原始块中最后6行的位置。

find()