2015-02-05 7 views
0

У меня есть файл в следующем формате:Textscan Matlab; Не читает формат

**400**,**100**::400,descendsFrom,**76**::0 
**400**,**119**::400,descendsFrom,**35**::0 
**400**,**4**::400,descendsFrom,**45**::0 
... 
... 

Теперь мне нужно прочитать, часть только в смелых. Я написал следующие форматы:

formatspec = '%d,%d::%*d,%*s,%d::%*d\n'; 
data = textscan(fileID, formatspec); 

Это не работает. Может кто-нибудь сказать мне, что случилось? Мне также нужно знать, как использовать «не использовать» и как действовать, если я хочу выразить точный способ записи моего файла, например, в приведенном выше случае.

+2

Вы пытаетесь смешивать блоки кода с форматированием в стиле Markdown, чтобы сделать текст полужирным? Являются ли двойные звездочки в вашем файле? Если это не так, отредактируйте свой вопрос, чтобы удалить их - блок кода отформатирован точно так же, как есть. Вам нужно использовать слова, чтобы описать, какие элементы вы хотите. – horchler

ответ

0

EDITED

Возможная проблема с частью в% S в formatspec переменной. Поскольку% s - произвольная строка, поэтому descendsFrom, 76 :: 0 часть строки упорядочена этой строкой. Таким образом, с помощью formatpec '% d,% d ::% d,% s,% d ::% d \ n' вы получите следующие ячейки из первой строки:

400 100 400 'descendsFrom, 76 :: 0'

чтобы решить эту проблему, у вас есть две возможности:

formatspec = %d,%d::%d,descendsFrom,%d::%d\n 

ИЛИ

formatspec = %d,%d::%d,%12s,%d::%d\n 

в первом случае 'строка descendForm' должна содержаться на каждой строке (как в вашем примере). Во втором случае строка может быть изменена, но ее длина должна быть равна 12.

+0

* в форматах textscan указано, что поле должно быть пропущено, они не лишние. – nkjt

+0

Вы правы Я отредактировал свой ответ. –

0

Ваш разделитель «,» вы должны сначала разграничить его, а затем запустить регулярное выражение. Вот как я бы об этом:

fileID = fopen('file.csv'); 
D = textscan(fileID,'%s %s %s %s ','Delimiter',','); %read everything as strings 

column1 = regexprep(D{1},'*','') 
column2 = regexprep(D{2},{'*',':'},{'',''}) 
column3 = D{3} 
column4 = regexprep(D{4},{'*',':'},{'',''}) 

Это должно генерировать ваши 4 колонки, которые вы можете затем комбинируют Я считаю, что Разделитель может быть только один символ. Более эффективным способом является непосредственно у regexprep на всей линии, которая будет генерировать:

test = '**400**,**4**::400,descendsFrom,**45**::0' 
test = regexprep(test,{'*',':'},{'',''}) 

>> test = 400,4400,descendsFrom,450 
+0

Спасибо за ответ. Да, я имею в виду, что я всегда могу просто поместить все в строку, а затем разделить, но мне нужно знать, как точно указать формат. В этом случае, может быть, в порядке есть разделитель «,», но что, если нет одного разделителя, и у меня есть файл вроде следующего: 400,100 :: 400; descends From: 76 :: 0 Затем я хочу знаете, как точно указать формат, и почему то, что я написал, не работает. – Prateek

+0

Хмммм Я не думаю, что вы можете сделать свой множественный разделитель в textscan, вы можете сделать sprintf на своей строке (используя код форматирования), прежде чем использовать текстовое окно, если хотите, но я не знаю, как указать несколько конкретных разделителей в textscan ... – GameOfThrows

+0

Благослови вас за форматирование вашего кода. Теперь ваши сообщения действительно выглядят красиво. – rayryeng

0

Вы можете сделать несколько разделителей в textscan, они должны быть представлены в виде массива ячеек строк. Вам не нужен символ конца строки в формате, и вам нужно установить «MultipleDelimsAsOne». Не имею MATLAB в руки, но что-то вдоль этих линий должно работать:

formatspec = '%d %d %*d %*s %d %*d'; 
data = textscan(fileID, formatspec,'Delimiter',{',',':'},'MultipleDelimsAsOne',1); 

Если вы хотите, чтобы вернуть его в виде матрицы чисел не массив ячеек, попробуйте добавить также вариант 'CollectOutput',1