реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Матлаб + чтение данных из файла, Как перепрыгнуть лишние строчки?
Diusha
сообщение Mar 21 2014, 00:06
Сообщение #1


Вечный студент
****

Группа: Участник
Сообщений: 500
Регистрация: 11-09-06
Из: Питер
Пользователь №: 20 262



Файл примерно такого содержания:

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.

Что не так?

Сразу попутно еще вопрос. Есть ли возножность перепрыгнуть строчку в середине файла (№ строки известен)?
Go to the top of the page
 
+Quote Post
Herz
сообщение Mar 21 2014, 09:04
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



А что мешает откорректировать переменную d уже после чтения?
"Перепрыгнуть" через строку в читаемом файле, не зная её номера - это как? По каким признаком её перепрыгивать? По-моему, проще всего прочесть всё как есть, а затем переформатировать матрицу как будет угодно, ведь для работы с переменными в Матлабе уже доступны любые инструменты.
Go to the top of the page
 
+Quote Post
BooZe
сообщение Mar 21 2014, 09:55
Сообщение #3





Группа: Новичок
Сообщений: 7
Регистрация: 29-11-10
Из: Минск
Пользователь №: 61 249



Можно попробовать в стиле С:
CODE

%Открываем файл на чтение
inFile = fopen('file.txt','r');
%Считываем первую строку
colNames = fgets(inFile);
%Считываем массив и транспонируем его
dataArray = fscanf(inFile,'%d %d',[2 Inf])';
%Закрываем файл
fclose(inFile);

Будет работать только если названия переменных в первой строке.
Go to the top of the page
 
+Quote Post
syoma
сообщение Mar 21 2014, 12:37
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 817
Регистрация: 14-02-07
Из: наших, которые работают за бугром
Пользователь №: 25 368



Может файл у Вас неправильный? У меня помню Матлпб так ругался, потому что не было полных 0x0D, 0x0A в конце строки.
Go to the top of the page
 
+Quote Post
Diusha
сообщение Mar 21 2014, 13:06
Сообщение #5


Вечный студент
****

Группа: Участник
Сообщений: 500
Регистрация: 11-09-06
Из: Питер
Пользователь №: 20 262



Цитата(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 в конце строки.

Проверил - "правильный"
Go to the top of the page
 
+Quote Post
Diusha
сообщение Mar 23 2014, 05:59
Сообщение #6


Вечный студент
****

Группа: Участник
Сообщений: 500
Регистрация: 11-09-06
Из: Питер
Пользователь №: 20 262



BooZe, а приведенный Вами код у Вас работает? Какая версия Матлаба?
Go to the top of the page
 
+Quote Post
syoma
сообщение Mar 24 2014, 10:23
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 817
Регистрация: 14-02-07
Из: наших, которые работают за бугром
Пользователь №: 25 368



Ребят, может я тупой, но спустя 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 содержит нужный массив.
Что я делаю не так?
Go to the top of the page
 
+Quote Post
Diusha
сообщение Mar 25 2014, 00:07
Сообщение #8


Вечный студент
****

Группа: Участник
Сообщений: 500
Регистрация: 11-09-06
Из: Питер
Пользователь №: 20 262



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-м – без.
Как «убрать лишние ковычки»?
Go to the top of the page
 
+Quote Post
BooZe
сообщение Mar 25 2014, 05:12
Сообщение #9





Группа: Новичок
Сообщений: 7
Регистрация: 29-11-10
Из: Минск
Пользователь №: 61 249



Цитата
код у Вас работает?

Да, я проверял.
Версия Matlab - 7.6.
Цитата
Как «убрать лишние ковычки»?

Нужно просто использовать для индексации вместо круглых скобок фигурные:
Код
strcat(f{1},'.txt')

При использовании круглых скобок Вы получаете в качестве ответа еще один cell array.
Go to the top of the page
 
+Quote Post
Diusha
сообщение Mar 25 2014, 11:07
Сообщение #10


Вечный студент
****

Группа: Участник
Сообщений: 500
Регистрация: 11-09-06
Из: Питер
Пользователь №: 20 262



Цитата(BooZe @ Mar 25 2014, 08:12) *
Код
strcat(f{1},'.txt')

Спасибо!

Цитата(BooZe @ Mar 25 2014, 08:12) *
Да, я проверял.

Еще раз попробовал с fopen – не ругается (видимо, в прошлый раз я чего-то пропустил), но пока не во всем разобрался. Поковыряюсь, если что, спрошу.

А с textread + headerlines не у меня одного затычки. Пока не принципиально (importdata хватает), но все же интересно было бы… если вдруг кто невзначай раскопает
Go to the top of the page
 
+Quote Post
syoma
сообщение Mar 26 2014, 10:25
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 817
Регистрация: 14-02-07
Из: наших, которые работают за бугром
Пользователь №: 25 368



Эхх, молодежь!
Пять минут изучения хелпа:
A = TEXTREAD('FILENAME','FORMAT',N,param,value, ...)
Т.е. param должен быть после кавычек, задающих формат, и числа читаемых строк N.
В простейшем случае:
A = TEXTREAD('FILENAME','',param,value, ...)

Т.е.
d=textread('my.txt','','headerlines',1)
прекрасно работает.

Читать с нужной строчки рекомендуют textscan.
Go to the top of the page
 
+Quote Post
Diusha
сообщение Mar 26 2014, 11:50
Сообщение #12


Вечный студент
****

Группа: Участник
Сообщений: 500
Регистрация: 11-09-06
Из: Питер
Пользователь №: 20 262



Классно!
Большое спасибо!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 09:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.01468 секунд с 7
ELECTRONIX ©2004-2016