Как мне прочитать текстовый файл с разделителями табуляции в MATLAB, который в основном состоит из чисел, но иногда содержит слово MAX в нескольких ячейках?

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

До сих пор я использовал dlmread для чтения этого диапазона числовых значений, и он работал нормально. Когда стоит МАКС там dlmread не работает.

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

data = dlmread(filename, '\t', 20, 5);

Вот ошибка:

Mismatch between file and format string.
Trouble reading number from file (row 152u, field 31u) ==> MAX
MAX MAX 552.397949  33.415199   7.425600    3.379600
6.6422090   \n

Есть ли способ прочитать этот файл, не конвертируя его в .csv? Я хочу прочитать файл и изменить ячейки с надписью MAX на число вроде 1500.


person krisharmas    schedule 04.03.2013    source источник


Ответы (3)


Вы можете попробовать textscan

C = textscan(fid, '%f', 'delimiter', '\t', 'treatAsEmpty', {'MAX'},'EmptyValue', 1500);

Это вернет вектор ячеек размером 1 на N, где N — количество значений в файле. Чтобы преобразовать его в матрицу, вы можете использовать reshape

C = reshape(cell2mat(C),[numOfRows numOfCols]);
person H.Muster    schedule 04.03.2013
comment
Спасибо! Это работает, если файл содержит только матрицу чисел, но, к сожалению, перед запуском матрицы есть некоторые данные заголовка. Как вы видите в вызове dlmread(filename, '\t', 20, 5), который я делал, я начинал с позиции 20,5, чтобы прочитать соответствующую матрицу чисел. Я не думаю, что у textscan есть такая возможность. Любые другие предложения? - person krisharmas; 05.03.2013
comment
textscan, конечно же, может обрабатывать заголовки и даже комментарии внутри файла. Например, если первые 5 строк файлов являются заголовком, просто добавьте параметр 'headerlines', 5 к вызову функции. Если вы предоставите образцы данных в своем вопросе, я могу помочь с примером. Для получения дополнительной информации о textscan см.: mathworks.de/de/help/matlab /ref/textscan.html - person H.Muster; 05.03.2013

http://www.mathworks.se/help/stats/tblread.html выглядит как хорошая функция для этой цели с простым использованием:

данные=tblread('data.tsv','\t')

person Ani    schedule 23.08.2013

Самый простой подход может состоять в том, чтобы просто предварительно обработать файл, выполнив поиск и замену для «MAX», заменив его либо на «inf», либо на число по вашему выбору (например, 1500).

person nibot    schedule 04.03.2013
comment
Вы имеете в виду, что человек, который присылает мне файл, сделает за меня замену? Я получаю эти файлы оптом. Есть ли способ автоматизировать этот процесс с моей стороны? И возможно ли это решение в MATLAB, чтобы я мог просто записать его прямо в функцию, где я читаю файлы? - person krisharmas; 04.03.2013
comment
Конечно, есть способ автоматизировать это. Какую операционную систему вы используете? - person nibot; 05.03.2013