2013-08-20 1 views
0

Я использую следующую команду для чтения файла CSV:TextScan прекращает чтение после 1 линии

fid=fopen('test.csv'); 
scannedData = textscan(fid, '%4.0u%2.0u%2.0u%2.0u%2.0u%2.0u,%u,%u,%q,%q,%f,%f,%.2f,%u','whitespace','"'); 
fclose(fid); 

Проблема в том, что TextScan не читает значение из последнего поля и останавливается после 1 линии. Пропуская это поле, назначьте его другим типом, используя многочисленные комбинации eof в текстовом экране, ничего не помогло.

Данные в файле выглядит следующим образом:

"20100324072328","501","1","str1","str2","4.6846712","52.0159507","1.250000","128.000000" 
"20100324072519","501","1","str1","str2","4.6846122","52.0159346","0.000000","128.000000" 
"20100324072640","501","1","str1","str2","4.6846014","52.0159453","0.000000","128.000000" 
"20100324072812","501","1","str1","str2","4.6845907","52.0159507","0.000000","96.000000" 
"20100324073002","501","1","str1","str2","4.6845800","52.0159614","0.000000","128.000000" 

Я хотел бы разобрать первый подал непосредственно TextScan как я пытаюсь с вышеупомянутыми командами.

Я не хочу использовать альтернативу чтения полей с помощью %q и затем разбора результирующих массивов.

Итак, я был бы признателен за любые предложения, чтобы сделать textscan делать все за один раз.

Спасибо.

+0

Вы должны '«Разделитель»,«»'. – Oleg

+0

Добавление опции разделителя позволяет только анализировать мое первое поле, и комбинация не читает остальные поля. (в сочетании с вышеупомянутым форматом чтения) Вот почему я выхожу из разделителя и помещаю запятые в formatpec. – user2618054

+0

Не используйте опцию whitespace, но вставляйте '' 'в строку формата, сохраняя разделитель на', '. – Oleg

ответ

1

Если вы хотите рассмотреть " как пробелы, то вы не должны использовать %q, который нуждается в двойные кавычки, чтобы определить полную строку и не может найти их, если вы считаете их пробельные:

fid = fopen('test.txt'); 
fmt = '%4u%2u%2u%2u%2u%2u%u%u%s%s%f%f%f%u'; 
out = textscan(fid,fmt,'Delimiter',',','Whitespace','"') 
fclose(fid) 

В качестве альтернативы я предлагаю в комментариях использовать:

fmt = '"%4u%2u%2u%2u%2u%2u" "%u" "%u"%q%q"%f" "%f" "%f" "%u"'; 
out = textscan(fid,fmt,'Delimiter',',') 

примечание как я пространство " ", иначе textscan() не может распознать, когда поля действительно конец.

Однако, я лично мог бы пойти на явное преобразование даты к серийному дате

fmt = '%s%u%u%s%s%f%f%f%u'; 
out = textscan(fid,fmt,'Delimiter',',','Whitespace','"') 
out{1} = datenum(out{1},'yyyymmddHHMMSS'); 
+0

Это действительно работает. Спасибо. Версия% q, о которой я говорил, состояла в том, чтобы прочитать все поля в виде строк и не использовать опцию whitespace. Преобразование даты, хотя я также считал, что использование datevec имеет только цель дальнейшей записи выходного файла с разбиением компонентов даты. – user2618054