如何在Matlab中读取具有可变行长度的文本文件?

时间:2015-04-07 12:49:32

标签: matlab csv textscan

我在Matlab中读取了大量的CSV文件。所有文件都具有相似的结构,除了最后一个字段是可选的。即一些文件包含它,其他文件不包含它。

此外,文件包含文字和数字字段,因此csvread不适用。

只有我知道的替代方案是textscan。不幸的是,我找不到可选字段的说明符。

我正在看规范:

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

并希望最后%s是可选的。

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

要逐行读取文件,可以使用函数fgetl。它读取一行,删除换行符并将该行作为字符串返回。在文件末尾,返回-1

然后,您可以使用sscanf根据您的格式规范(包括%s)提取数据。如果输入数据末尾没有包含任何字符串,则最后一个字段为空。

fid = fopen('file.txt','r');
while 1
    line = fgetl(fid);
    if line == -1
        break;
    end
    A = sscanf(line,formatSpec);
    ...
end

然后,您可以使用A执行任何操作。

例如,请查看以下示例:

line = '1 2.5 3.6 abc';
A = sscanf(line,'%d %f %f %s')

A =
    1.0000
    2.5000
    3.6000
   97.0000
   98.0000
   99.0000

字符串为A(4:end)。如果isempty(A(4:end)),该字符串为空,这样您就可以根据需要存储数据,例如在一个牢房里。

答案 2 :(得分:0)

假设您不需要可选列,为什么不通过%* s和分隔符设置为换行来忽略该行的其余部分?