在Matlab中读取txt文件

7

我有一个问题,无法读取包含10列和2行标题的txt文件,但问题在于文件中间出现了多次相同的标题,textread()函数无法正常使用。这是我的文件示例:

file.txt

headerline1 aaaa
headerline2 111 123
20/12/2000 name1 name2 name3... name8 0
21/12/2000 name1 name2 name3... name8 0
22/12/2000 name1 name2 name3... name8 0
headerline1 aaaa
headerline2 111 123
25/12/2000 name1 name2 name3... name8 0
27/12/2000 name1 name2 name3... name8 0
...

以下是我尝试的代码:

[date, name1, name2, name3, name4, name5, name6, name7, name8, status] = ...
    textread('file.txt', '%s %s %s %s %s %s %s %s %s %d', 'headerlines',2);

在重复的标题所在的行出现了错误。您有什么想法可以避免这些标题并读取完整的文件吗?问题是我有数百个这些类型的文件,所以我不能每次手动删除。

谢谢您的帮助。


1
我建议使用Perl脚本(或其他好的文本处理语言,如sed或awk,取决于您最熟悉哪种语言)预处理文件并制作没有重复标题的副本。 - Ben Voigt
我同意Ben的观点。textscan和textread都需要格式化的数据,因此您需要先进行预处理。 - Franck Dernoncourt
2个回答

6
你可以使用textscan逐行读取文件,将整行作为字符串处理。然后删除头部行并处理剩余内容。
这里是一个示例:
%# read the whole file to a temporary cell array
fid = fopen(filename,'rt');
tmp = textscan(fid,'%s','Delimiter','\n');
fclose(fid);

%# remove the lines starting with headerline
tmp = tmp{1};
idx = cellfun(@(x) strcmp(x(1:10),'headerline'), tmp);
tmp(idx) = [];

%# split and concatenate the rest
result = regexp(tmp,' ','split');
result = cat(1,result{:});

%# delete temporary array (if you want)
clear tmp

是的,这就是我会做的——将所有内容保留在MATLAB中,并使您能够轻松适应不同类型的文件等。 - Bill Cheatham
哇!它完美地工作了!而且似乎比我用fgetl更容易。非常感谢!!! - Mallvina

2
如果您不想使用perl、awk或类似的工具来预处理数据(我真的可以理解),您可以尝试使用fopenfgetlfeof逐行读取文件(例如,可以在此处看到一个示例:https://dev59.com/4HE85IYBdhLWcg3wShWf#2858208),并检查每一行是否包含标题。如果是,则continue循环。如果不是,则像您现在已经做的那样使用textscan进行处理。

非常感谢!那正是我所做的: - Mallvina
fid=fopen('file.txt'); while 1 tline = fgetl(fid); if ~ischar(tline), break,end end fclose(fid) 现在只需要用textread保存每一行即可。我完成后会发布答案。 - Mallvina
不,你的操作其实是正确的 :-) 这并不难,如果您有任何疑问,只需问或查看页面的常见问题解答即可 :) - tim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接