我有一个类似的数据文件:
# data file
# blah
# blah
0.000000, 0.0, 24.198, 6.864,NaN,NaN,NaN,NaN
0.020000, 0.0, 24.198, 6.864,NaN,NaN,NaN,NaN
0.040000, 0.0, 24.198, 6.864,NaN,NaN,NaN,NaN
0.060000, 0.0, 24.198, 6.864,NaN,NaN,NaN,NaN
0.080000, 0.0, 24.198, 6.864,NaN,NaN,NaN,NaN
0.100000, 0.0, 24.198, 6.864,NaN,NaN,NaN,NaN
0.120000, 0.0, 24.198, 6.864,NaN,NaN,NaN,NaN
我想用Octave程序阅读它。
csvread(file,3,0)在这种情况下效果很好,但我担心必须手工制作3个。
在做csvread之前,是否有某种方式可以说#扔掉任何以#开头的行和任何空白行?
答案 0 :(得分:4)
在八度音中,你可以做到
d = load("yourfile")
应该忽略#行
修改强>
以上使用自动检测文件类型,您也可以使用d = load ("-ascii", "yourfile").
help load
来强制它:
'-ascii'
Force Octave to assume the file contains columns of numbers in
text format without any header or other information. Data in
the file will be loaded as a single numeric matrix with the
name of the variable derived from the name of the file.
不幸的是,帮助没有提到以%或#开头的行被忽略。为此你必须查看源代码(幸运的是,因为GNU Octave是自由软件,所以可以使用它)get_mat_data_input_line from octave source
从那里你可以看到跳过%或#之后的所有字符。
答案 1 :(得分:3)
csvread
不允许此选项。相反,您可以使用textscan
,但是,您需要知道csv文件有多少列(或行)。
例如:
fid = fopen('csvFile.csv','r');
c = textscan(fid,'%f','commentStyle','#','delimiter',',');
fclose(fid); %# close the file as soon as we don't need it anymore
array = reshape([c{:}],[],7)';
答案 2 :(得分:1)
这是一种跳过以注释字符串开头的标题行的方法。 csvread
行可以替换为dlmread
除','
以外的分隔符调用。这两个函数都比八度音阶3.8.2上的textscan
快得多。
fid = fopen('csvFile.csv','r');
comment = '#';
while strcmp(fgets(fid, length(comment)), comment)
% line begins with a comment, skip it
fskipl(fid);
endwhile
% get back, because the last read length(comment) characters
% are not comments, actually
fseek(fid, -length(comment), SEEK_CUR);
c = csvread(fid);
fclose(fid);