2014 dxdy logo

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

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




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

Я в фортране только начинаю, и у меня возник (вероятно глупый) вопрос по поводу чтения из текстового файла.
Пусть в текстовом файле 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 
Аватара пользователя
Если Вы заранее знаете число строк 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 
Аватара пользователя
Mottle
Спасибо, на таком модельном массиве хорошо работает. А Вы не знаете, что делать, если в файле помимо чисел имеются символы? В этом случае такая программа выдает ошибку (потому что массив из действительных чисел). Т.е. проблема в том, что сначала в массив считывается весь файл, а потом идет работа с массивом. А вот конкретную строчку или столбец можно считать? Ну как в матлабе, например.

 
 
 
 Re: Fortran: cчитать конкретые записи из текстового файла
Сообщение26.02.2012, 10:19 
По поводу считать конкретную строку/столбец: нет, нельзя.
А как вы это делаете в матлабе? Если не секрет? :-)

-- 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 
Roy Rogers в сообщении #542655 писал(а):
если в файле помимо чисел имеются символы?

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

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

 
 
 
 Re: Fortran: cчитать конкретые записи из текстового файла
Сообщение26.02.2012, 20:09 
Аватара пользователя
Если необходимо рассмотреть чтение в общем случае, то можно считывать строку, разбивать ее на слова, скажем по пробелам, и выбирать нужный столбец. Подобный пример кода для анализа строки, если мне не изменяет память, приведен в книге О.Бартеньева "Современный Фортран".
Другое дело, что на Фортране это делать не очень удобно. Если автор топика не ограничен в выборе языка и обладает некоторым (весьма небольшим) количеством времени, то я бы порекомендовал Питон. Вот тут это делается элементарно. В добавок ко всему это свободный продукт.

 
 
 
 Re: Fortran: cчитать конкретые записи из текстового файла
Сообщение26.02.2012, 22:11 
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 
Перечитал еще разок, тут вот получилось не вполне понятно:
TupaHo3aBp в сообщении #542997 писал(а):
То есть у Вас есть n cтрочек заголовка, а дальше m строчек c данными. Соответственно, объявляем довольно обширную строковую переменную, и запихиваем в нее всю читаемую строку. Поскольку разбираться с заголовком мы точно не будем, то каждый раз при чтении мы будем все читать в одну и ту же переменную. Пусть данные перезаписываются, нам не жалко.

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

 
 
 
 Re: Fortran: cчитать конкретые записи из текстового файла
Сообщение29.02.2012, 23:11 
Аватара пользователя
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 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group