在Octave / MATLAB中读取csv文件时,我可以忽略注释行吗?

时间:2014-10-05 19:46:02

标签: matlab parsing csv comments octave

我有一个类似的数据文件:

# 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之前,是否有某种方式可以说#扔掉任何以#开头的行和任何空白行?

3 个答案:

答案 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);