2014-10-05 1 views
3

У меня есть файл данных, который выглядит как:Могу ли я игнорировать строки комментариев при чтении в CSV-файле в Octave/MATLAB?

# 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 (файл, 3,0) отлично работает в этом случае, но я беспокоюсь о том, что вам нужно будет разобраться с тремя руками.

Есть ли способ сказать «выбросить любые строки, начинающиеся с #, и любые пустые строки, прежде чем делать csvread»?

ответ

4

В октаве вы могли бы сделать

d = load("yourfile") 

, который должен игнорировать # линии

Edit: выше использует автоопределение типа файла, вы могли бы также заставить его с 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

Красиво простые и быстрые, спасибо! Хотелось бы, чтобы я видел ваш ответ, прежде чем писать свою ... – ederag

+0

Ничего себе, есть ли какие-либо документы для этого? –

+0

@JohnLawrenceAspden https://www.gnu.org/software/octave/doc/interpreter/Simple-File-I_002fO.html, кажется, что он по умолчанию «-ascii» – ederag

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)'; 
1

Вот способ пропуска строки заголовка, начинающийся с строки комментария. Линия csvread может быть заменена вызовом dlmread для разделителей, отличных от ','. Обе эти функции намного быстрее, чем textscan на октаве 3.8.2.

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