У меня есть файл с форматированными данными, который обычно составляет миллиарды строк длиной, с несколькими строками заголовков переменной длины. Файл данных имеет вид: Fortran: Как пропустить много строк файла данных эффективно
# header 1 # header 2 # headers are of variable length. # data begins from next line. 1.23 4.56 7.89 0.12 2.34 5.67 8.90 1.23 : : # billions of lines of data, each row the same length, same format. -- end of file --
Я хотел бы, чтобы извлечь часть данных из этого файла, и мой текущий код выглядит следующим образом:
<pre>
do j=1,jmax !Suppose I want to extract jmax lines of data from the file.
[algorithm to determine number of lines to skip, "N(j)"]
!This determines the number of lines to skip from the previous file
!position, when the data was read on j-1th iteration.
!Skip N-1 lines to go to the next data line to read off:
do i=1,N-1
read(unit=unit,fmt='(A)')
end do
!Now read off the line of data I want:
read(unit=unit,fmt='(data_format)'),data1,data2,etc.
!Data is stored in some arrays.
end do
</pre>
Проблема в том, N (к) может быть где-то между 1 и несколькими миллиардами, поэтому для запуска кода требуется некоторое время.
Мой вопрос: есть ли более эффективный способ пропускать миллионы строк данных? Единственный способ, которым я могу придумать, придерживаясь Fortran, - открыть файл с прямым доступом и перейти к нужной строке при открытии файла.
Вы также можете открыть как поток, прочитать заголовок, а затем рассчитать позицию начала вашей линии. –
Что написало файл? Какие соглашения нужно обрабатывать в терминах разделителей записей/символов строки? Может ли файл рассматриваться как неформатированный поток символьных данных с ACHAR (10) для окончаний строк? – IanH
Файл является результатом другого кода. Цифры - это целые числа и double precisionrs, и они были записаны в файл с чем-то вроде: «write (unit = unit, fmt = '(I5, I4, ES12.4, ES16.8)'))», зацикливается как много раз, поскольку есть части данных. – benetianfish