我在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
是可选的。
答案 0 :(得分:0)
你可以试试strsplit功能
答案 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和分隔符设置为换行来忽略该行的其余部分?