Чтение нескольких строк из CSV-файла

У меня есть файл csv, который выглядит следующим образом, когда я открываю его в блокноте...

val1,val2,val3,val4,val5,val6,val7,val8,val9,val10,val11,val12,val13,result 63,1,1,145,233,1,2,150,0,2.33,0,6,F
67 ,1,4,160,286,0,2,108,1,1.5,2,3,3,T
67,1,4,120,229,0,2,129,1,2.6,2,2,7,T
37,1 ,3,130,250,0,0,187,0,3,5,3,0,3,F

Я хотел бы прочитать эти данные в Matlab и нашел этот вопрос, который действительно выглядит многообещающим. . Мой код для этой реализации выглядит следующим образом...

fid = fopen(path);
out = textscan(fid,'%f%f%f%f%f%f%f%f%f%f%f%f%f','HeaderLines',1,'delimiter',',','CollectOutput',1);
fclose(fid);

Однако это, кажется, читается только в первой строке в Matlab. Как я могу заставить его читать весь файл?

out{1}
ans =
      63.0000    1.0000    1.0000  145.0000  233.0000    1.0000    2.0000  150.0000         0    2.3000    3.0000         0    6.0000

person Marmstrong    schedule 15.10.2014    source источник


Ответы (2)


После того, как я некоторое время стучал головой о стол, меня осенило, что проблема может заключаться в том, что я не указал строку результата в спецификаторе формата. Это данные, которые мне не нужны в моем коде, и поэтому я их пропустил. Добавление и добавление %s в конце позволило прочитать все данные.

Примечание на будущее: укажите все поля в спецификаторе формата и игнорируйте их при кодировании.

Фактический код должен выглядеть следующим образом...

out = textscan(fid,'%f%f%f%f%f%f%f%f%f%f%f%f%f%s','HeaderLines',1,'delimiter',',','CollectOutput',1);
person Marmstrong    schedule 15.10.2014

Что часто происходит с textscan, так это то, что если вы используете неправильный спецификатор или в файле есть что-то неожиданное, textscan читает столько файла, сколько может, а затем останавливается, когда доходит до чего-то, что он не может правильно проанализировать. К сожалению, останавливается молча, без ошибок. Распространенными симптомами этой проблемы являются невозможность прочитать файл полностью или вывод, который кажется остановленным на середине строки. Если вам не нужны строки, вы можете указать textscan пропустить их с помощью *:

out = textscan(fid,''%f%f%f%f%f%f%f%f%f%f%f%f%f%*s','HeaderLines',1,'delimiter',',','CollectOutput',1);

При создании более длинных спецификаторов формата может быть проще использовать repmat:

out = textscan(fid, [repmat('%f',[1,13]),'%*s'],'HeaderLines',1,'delimiter',',','CollectOutput',1);
person nkjt    schedule 15.10.2014
comment
CSVread, я думаю, не работает, потому что мой файл содержит нечисловые значения. - person Marmstrong; 15.10.2014
comment
У меня было в голове, что все в порядке, если вы читаете только числовую часть, но, видимо, нет (может быть, это xlsread). - person nkjt; 15.10.2014