2013-07-25 4 views
4

я пытаюсь прочитать в файле с содержит тысячи строк формата:Как TextScan с несколькими разделителями

AAAAAAAA 2013.99.2314.029 0 OFF N 

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

2013.99.2314.029 

is year 2013, день 99, второй 2314.029.

Я хочу использовать TextScan читать весь файл сразу, но как-то разделить, что сложная строку даты, как я прочитал в

В настоящее время у меня есть сканстрока:.

SCAN_STR = '%s\t%f.%f\t%s\t%s\t%*s' 

Каких считывает строку даты в два поплавка. Мне бы очень хотелось прочитать его в двух ints и float. Но с использованием

SCAN_STR = '%s\t%d.%d.%f\t%s\t%s\t%*s' 

Усекает его до 2013 года и 2314 и испортит остальную часть линии. Я попытался убежать. с '.' но это вызывает ошибку.

Любые предложения? Я бы хотел сделать это, поскольку он сканируется из-за большого размера файла. При попытке изменить типы больших наборов данных память работает на низком уровне.

EDIT:

Действительно мне нужна сканстроку для 2013.99.2314.029 вернуть два целых числа и с плавающей точкой.

'%d.%d.%f' 

Не работает. Также не используется разделитель как.. Я тоже пробовал% u. Он округляет десятичную цифру, когда читает их.

Le sigh.

+0

Первое, что приходит на ум: вместо '% d' вы можете попробовать'% [0-9] '. Тем не менее, это будет читать целые числа как строки, вам придется преобразовать их в числа позже (_e.g_ используя 'str2num'), если вам нужно их числовое значение. –

+1

Использовать textscan один раз для всей строки, затем textscan снова в поле, которое вы хотите разделить дальше? – Ansari

+1

Я ненавижу textscan. Почему бы им не поместить приличный синтаксический анализ текста в Matlab? – Bitwise

ответ

0

Я только что попробовал это с MATLAB 2012b и, похоже, работал на моем конце.

SCAN_STR = '%s\t%4d.%d.%f\t%d\t%s%*[^\n]' 
+0

Это не работает на моем конце :(Он читает 99 как 99.2314 и округляет его, оставляя float как 29. Я попытался добавить% 2d вместо% d для второго int, но он работает, но он не работает если я использую% 3d, поэтому он ломается после 100 дней в году. Или работает только после 100 дней в году ... – polkid

Смежные вопросы