Diusha
Mar 21 2014, 00:06
Файл примерно такого содержания:
X Y
23 6
41 85
35 95
Нужно прочитать цифири.
Если «X Y» из файла выкинуть,
d=textread('file.txt')
– работает на «ура». Но требуется читать без правки файла.
На
d=textread('file.txt','headerlines',1)
ругается:
??? Error using ==> dataread
Number of outputs must match the number of unskipped input fields.
Что не так?
Сразу попутно еще вопрос. Есть ли возножность перепрыгнуть строчку в середине файла (№ строки известен)?
А что мешает откорректировать переменную d уже после чтения?
"Перепрыгнуть" через строку в читаемом файле, не зная её номера - это как? По каким признаком её перепрыгивать? По-моему, проще всего прочесть всё как есть, а затем переформатировать матрицу как будет угодно, ведь для работы с переменными в Матлабе уже доступны любые инструменты.
Можно попробовать в стиле С:
CODE
%Открываем файл на чтение
inFile = fopen('file.txt','r');
%Считываем первую строку
colNames = fgets(inFile);
%Считываем массив и транспонируем его
dataArray = fscanf(inFile,'%d %d',[2 Inf])';
%Закрываем файл
fclose(inFile);
Будет работать только если названия переменных в первой строке.
Может файл у Вас неправильный? У меня помню Матлпб так ругался, потому что не было полных 0x0D, 0x0A в конце строки.
Diusha
Mar 21 2014, 13:06
Цитата(Herz @ Mar 21 2014, 12:04)

А что мешает откорректировать переменную d уже после чтения?
Сообщение об ошибке при попытке чтения с помощью textread файла, где кроме чисел есть что-то еще. Насколько я понимаю, так и должно быть. Для этого и существует опция headerlines.
Цитата(Herz @ Mar 21 2014, 12:04)

"Перепрыгнуть" через строку в читаемом файле, не зная её номера - это как?
Цитата(Diusha @ Mar 21 2014, 03:06)

(№ строки известен)
Цитата(BooZe @ Mar 21 2014, 12:55)

CODE
inFile = fopen('file.txt','r');
colNames = fgets(inFile);
dataArray = fscanf(inFile,'%d %d',[2 Inf])';
fclose(inFile);
1-ю строку кода проглатывает, на 2-ю ругается:
??? Error using ==> fscanf
Invalid file identifier. Use fopen to generate a valid file identifier.
Цитата(syoma @ Mar 21 2014, 15:37)

Может файл у Вас неправильный? ... не было полных 0x0D, 0x0A в конце строки.
Проверил - "правильный"
Diusha
Mar 23 2014, 05:59
BooZe, а приведенный Вами код у Вас работает? Какая версия Матлаба?
Ребят, может я тупой, но спустя 5 минут после открытия матлаба у меня все работает.
Файл my.txt содержит:
X Y
23 6
41 85
35 95
Import wizard открывает и импортирует этот файл без проблем - овцы отдельно(X Y), волки отдельно(Данные).
Смотрю хелп - возможность проделывания того же самого заключена в функции importdata.
Синтакс: A = importdata(filename,delimiterIn,headerlinesIn)
В итоге:
A = importdata('my.txt',' ',1)
делает то же самое, только создает структуру А, в которой волки отдельно, овцы отдельно и все выковыривается очень легко. A.data содержит нужный массив.
Что я делаю не так?
Diusha
Mar 25 2014, 00:07
syoma, спасибо! Я об этом мечтал!
Еще вопрос.
Задан массив:
f={'abc', 'def'};
Требуется к нужному элементу массива добавить '.txt' и по получившемуся имени прочитать файл.
textread(strcat(f(1),'.txt'))
и
importdata(strcat(f(1),'.txt'),' ',1)
дают ошибку.
Если сделать так:
a='abc';
textread(strcat(a,'.txt'))
, все норм.
Есть такое наблюдение (в котором, как мне чуется, вся собака и зарыта):
>> strcat(f(1),'.txt')
ans = 'abc.txt'
>> strcat(a,'.txt')
ans = abc.txt
В 1-м случае ans с ковычками, во 2-м – без.
Как «убрать лишние ковычки»?
Цитата
код у Вас работает?
Да, я проверял.
Версия Matlab - 7.6.
Цитата
Как «убрать лишние ковычки»?
Нужно просто использовать для индексации вместо круглых скобок фигурные:
Код
strcat(f{1},'.txt')
При использовании круглых скобок Вы получаете в качестве ответа еще один cell array.
Diusha
Mar 25 2014, 11:07
Цитата(BooZe @ Mar 25 2014, 08:12)

Спасибо!
Цитата(BooZe @ Mar 25 2014, 08:12)

Да, я проверял.
Еще раз попробовал с fopen – не ругается (видимо, в прошлый раз я чего-то пропустил), но пока не во всем разобрался. Поковыряюсь, если что, спрошу.
А с textread + headerlines не у меня одного затычки. Пока не принципиально (importdata хватает), но все же интересно было бы… если вдруг кто невзначай раскопает
Эхх, молодежь!
Пять минут изучения хелпа:
A = TEXTREAD('FILENAME','FORMAT',N,param,value, ...)
Т.е. param должен быть после кавычек, задающих формат, и числа читаемых строк N.
В простейшем случае:
A = TEXTREAD('FILENAME','',param,value, ...)
Т.е.
d=textread('my.txt','','headerlines',1)
прекрасно работает.
Читать с нужной строчки рекомендуют textscan.
Diusha
Mar 26 2014, 11:50
Классно!
Большое спасибо!
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.