2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Fortran: cчитать конкретые записи из текстового файла
Сообщение19.02.2012, 23:20 
Аватара пользователя


11/06/11
66
МИФИ
Добрый вечер!

Я в фортране только начинаю, и у меня возник (вероятно глупый) вопрос по поводу чтения из текстового файла.
Пусть в текстовом файле inp.txt записи типа такого
Код:
0.12  0.55  1.23
1.56  4.33  1.63
9.24  3.11  7.09
А я хочу считать второй столбец в массив x(i). То есть так, чтобы у меня было
x(i) = (0.55 4.33 3.11)
Я знаю как считать все поля последовательно
Используется синтаксис Fortran
open(2, file = 'inp.txt', status = 'old', iostat = ios)
read(2, *, iostat = ios) (x(i), i = 1, N)
или как сделать из них двумерный массив. А как сделать так, чтобы в массив считывался только 2-ой столбец?

Буду очень признателен за помощь.

 Профиль  
                  
 
 Re: Fortran: cчитать конкретые записи из текстового файла
Сообщение24.02.2012, 17:17 
Аватара пользователя


25/01/09
25
Россия — Швейцария
Если Вы заранее знаете число строк n и число столбцов m, то можно, например так:
код: [ скачать ] [ спрятать ]
Используется синтаксис Fortran
program readArray

integer                 i,j,n,m,curColumn
real, allocatable::     A(:,:),x(:)

n=3
m=3

allocate(A(n,m),x(m))

open(10,file='inp.txt')
    do i=1,n
        read(10,*)(A(i,j),j=1,m)
    enddo
close(10)

curColumn=2
x=A(:,curColumn)

write(*,"(f6.2,1x)")x

end program readArray
 

 Профиль  
                  
 
 Re: Fortran: cчитать конкретые записи из текстового файла
Сообщение26.02.2012, 00:08 
Аватара пользователя


11/06/11
66
МИФИ
Mottle
Спасибо, на таком модельном массиве хорошо работает. А Вы не знаете, что делать, если в файле помимо чисел имеются символы? В этом случае такая программа выдает ошибку (потому что массив из действительных чисел). Т.е. проблема в том, что сначала в массив считывается весь файл, а потом идет работа с массивом. А вот конкретную строчку или столбец можно считать? Ну как в матлабе, например.

 Профиль  
                  
 
 Re: Fortran: cчитать конкретые записи из текстового файла
Сообщение26.02.2012, 10:19 


01/02/12
13
По поводу считать конкретную строку/столбец: нет, нельзя.
А как вы это делаете в матлабе? Если не секрет? :-)

-- 26.02.2012, 09:39 --

В принципе, можно поступить так:
Если ваш файл содержит строки
e 13.4 asd
e 25.7 6fr
e 56.24 ddd

то читаем второй столбец:
Код:
character(5) chBuf1,chBuf2
double precision a(3)

open (1,file = 'data.dat')
do i = 1,3
    read(1,*) chBuf1,a(i),chBuf2
end do
close(1)
print *,a
end

 Профиль  
                  
 
 Re: Fortran: cчитать конкретые записи из текстового файла
Сообщение26.02.2012, 10:51 
Заслуженный участник


19/07/08
1266
Roy Rogers в сообщении #542655 писал(а):
если в файле помимо чисел имеются символы?

Как-то так
Код:
read(1,'(15X,f6.2)') x

Будет читать начиная с 15-го символа в строчке.
Если чётко в определённом месте строчки столбец. Иначе -- надо читать в строчку и потом её парсить. Лучше это делать не на фортране.

 Профиль  
                  
 
 Re: Fortran: cчитать конкретые записи из текстового файла
Сообщение26.02.2012, 20:09 
Аватара пользователя


25/01/09
25
Россия — Швейцария
Если необходимо рассмотреть чтение в общем случае, то можно считывать строку, разбивать ее на слова, скажем по пробелам, и выбирать нужный столбец. Подобный пример кода для анализа строки, если мне не изменяет память, приведен в книге О.Бартеньева "Современный Фортран".
Другое дело, что на Фортране это делать не очень удобно. Если автор топика не ограничен в выборе языка и обладает некоторым (весьма небольшим) количеством времени, то я бы порекомендовал Питон. Вот тут это делается элементарно. В добавок ко всему это свободный продукт.

 Профиль  
                  
 
 Re: Fortran: cчитать конкретые записи из текстового файла
Сообщение26.02.2012, 22:11 


26/02/12
50
Roy Rogers в сообщении #542655 писал(а):
Mottle
Спасибо, на таком модельном массиве хорошо работает. А Вы не знаете, что делать, если в файле помимо чисел имеются символы? В этом случае такая программа выдает ошибку (потому что массив из действительных чисел).

Уточните хотя бы структуру файла. Лично у меня есть подозрения, что такой файл в Вашем случае формируется прибором и имеет некоторый заголовок, после которого идут численные данные. Например:
Код:
Эксперимент от 32 февраля 2011 года.
Тип эксперимента: Определение предела растяжимости резинки от трусов
Данные:
относительное удлинение - модуль упругости - абсолютное удлинение
0.12  0.55  1.23
1.56  4.33  1.63
9.24  3.11  7.09
.............

То есть у Вас есть n cтрочек заголовка, а дальше m строчек c данными. Соответственно, объявляем довольно обширную строковую переменную, и запихиваем в нее всю читаемую строку. Поскольку разбираться с заголовком мы точно не будем, то каждый раз при чтении мы будем все читать в одну и ту же переменную. Пусть данные перезаписываются, нам не жалко.

Еще момент: в ту же строковую переменную имеем полное право читать и строчки с данными, если они вдруг нам не нужны. Опять же, данные эти мы разбирать не будем, они просто теряются.

А в читаемых правильно (как числа) данных мы выбираем только второй столбец. Mottle предложил для этого абсолютно корректное решение, которое, кроме того, в две секунды видоизменяется на тот случай, когда надо выбрать, скажем, только третью колонку. Но можно поступить варварски и опять же читать все ненужные числа в некие буферные переменные, данные из которых никак не обрабатывать - они перезапишутся и потеряются. Ну и из лентяйства примем, что в каждой строке данных, принимаемых на ввод, ровно 3 числа. Как в поставленной задаче. Такой ленивый вариант тоже может быть переделан на другой столбец или другое число данных в строке, но потребуется уже не 2 секунды. Ну, секунд 10, наверно. Так что право на жизнь имеет! :P

Дополнительно: предполагается, что числа n и m (сколько строк пропускаем и сколько обрабатываем) вводятся с клавиатуры. Пояснения к вводу будут выведены транслитом. Почему? Русский шрифт в консольном окне должен быть в DOS-кодировке, не разбирающиеся в нюансах люди могут и редактора подходящего для этого не найти. Блокнот из Windows не подходит! :lol: В принципе, эти же два числа можно приписать впереди начала файла и обойтись без консоли, надо только программу соответствующим образом переписать.
код: [ скачать ] [ спрятать ]
Используется синтаксис Fortran
program readcolumn
implicit none

  integer :: j, m, n, ios
  real, allocatable :: x(:)
  real :: d1, d2                                ! dummy variables
  character (len=255) :: stroka       ! dummy string variable

write(*,*) 'Vvedite chislo strok zagolovka'
read(*,*) n
write(*,*) 'Vvedite chislo chitaemyh strok'
read(*,*) m

  allocate(x(m))
  open(11, file='inp.txt', status = 'old', iostat = ios)      ! номерок 2 зарезервирован! Я взял 11 :)

  ! Начинаем наши грязные делишки!

  do j = 1,m+n           ! реально читаем заголовок + m нужных строк
    if(j.le.n) then
      read(11,*) stroka
    else
      read(11,*) d1, x(j-n), d2
    end if
  end do
 !............................................
 ! Тут как-то выводим получившийся массив. Можно, как предложил Mottle:
  write(*,"(f6.2,1x)")x           ! кстати, оператор должен работать, хоть и сидит весь среди комментариев!
 !..............................................
  deallocate(x)      !освобождаем память
  close(11)

end program

Компилировать не пробовал

 Профиль  
                  
 
 Re: Fortran: cчитать конкретые записи из текстового файла
Сообщение27.02.2012, 06:34 


26/02/12
50
Перечитал еще разок, тут вот получилось не вполне понятно:
TupaHo3aBp в сообщении #542997 писал(а):
То есть у Вас есть n cтрочек заголовка, а дальше m строчек c данными. Соответственно, объявляем довольно обширную строковую переменную, и запихиваем в нее всю читаемую строку. Поскольку разбираться с заголовком мы точно не будем, то каждый раз при чтении мы будем все читать в одну и ту же переменную. Пусть данные перезаписываются, нам не жалко.

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

 Профиль  
                  
 
 Re: Fortran: cчитать конкретые записи из текстового файла
Сообщение29.02.2012, 23:11 
Аватара пользователя


11/06/11
66
МИФИ
Evgeny_2012 в сообщении #542702 писал(а):
По поводу считать конкретную строку/столбец: нет, нельзя.
А как вы это делаете в матлабе? Если не секрет?
А вроде бы командой
Используется синтаксис Matlab M
dlmread('filename',delimeter,R,C)
можно считать со строки R и столбца С. Или я уже все попутал?
Evgeny_2012 в сообщении #542702 писал(а):
В принципе, можно поступить так:
Если ваш файл содержит строки
e 13.4 asd
e 25.7 6fr
e 56.24 ddd

то читаем второй столбец
Это как раз то, что надо! Большое спасибо!
TupaHo3aBp в сообщении #542997 писал(а):
Уточните хотя бы структуру файла. Лично у меня есть подозрения, что такой файл в Вашем случае формируется прибором и имеет некоторый заголовок, после которого идут численные данные.
Да, извините. Я как-то не подумал. На самом деле у меня на данный момент структура файла как сказал Evgeny_2012. Но ваша конструкция мне тоже наверняка понадобится. Большое спасибо.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group