Импорт ASCII с разделителями табуляции построчно с пробелами в значениях - PullRequest
1 голос
/ 22 апреля 2019

Matlab неправильно разделяет строки, разделенные табуляцией пробелами между словами.Как мне заставить это работать?

Например, скажем, у меня есть файл с этими двумя строками, которые я хочу извлечь, первая - строка заголовка, а вторая - одна строка данных:

#DATA_NAME    field1    field2    field3
DATA_NAME    14    A String    34.1

(разделители - это табуляции, но я показываю здесь с несколькими пробелами)

Я написал собственный анализатор, который должен привести к таблице с:

field1       field2      field3
______       ______      ______
  14        A String      34.1

What I 'Я вижу что-то вроде:

field1       field2     field3
______       ______     ______
  14           A        String

У меня есть решение, использующее функцию split(), идущую построчно с fgetl, которая работает, если в записях нет пробелов.Выполнение:

splitted = split(line, '\t')

не похоже на работу.Я сделал некоторую проверку, и разделители не == '\ t' ...

(Я должен использовать свой собственный анализатор, потому что в одном файле много разных типов данных, каждый с разныминомера столбцов и разных заголовков.)

Ответы [ 3 ]

1 голос
/ 23 апреля 2019

используйте char(09) вместо '\t'

Я не могу перечислить их точно, но я заметил, что некоторые из синтаксического анализатора строк Matlab распознают '\t' как правильный TAB символ,но некоторые другие не распознают его и рассматривают его как 2 отдельных символа '\' и 't'.

пример:

>> double('\t')
ans =
    92   116

Это вызвало у меня проблемы даже при использовании textscan в прошлом, так что теперь, за исключением fprintf, где я знаю, что это работает, везде я всегда использую код ascii 09 для символа табуляции вместо сокращенной записи '\t'.

Дляпример:

tabc = char(09) ;
C= textscan( s , '%s' , 'delimiter',tabc ) ; % or in any other function using 'delimiters'

И для демонстрации первого примера:

>> double('\t')
ans =
    92   116
>> double(tabc)
ans =
     9

Иногда это не имеет значения, но если у вас возникают проблемы с TAB символы, используя точный код ascii, избавят вас от сомнения, правильно ли он интерпретирован или нет ...

1 голос
/ 23 апреля 2019

Подобный вопрос к этому здесь .Вы можете попробовать:

C = textscan(fopen(filename),'%s %d %s %d');

Эта строка возвращает ячейку C со всеми значениями.Ознакомьтесь с текстовым документом Matlab .

0 голосов
/ 23 апреля 2019

Это будет работать для разделения по вкладке:

splitted = strsplit(aLineOfText, '\t');

(Он обрабатывает строки по-разному и заставляет меня переделывать сценарий, но, похоже, работает правильно.)

...