2 Вопрос: Как прочитать конкретный столбец из matrix-textfile? не читая всю строку?

вопрос создан в Thu, May 2, 2019 12:00 AM

У меня есть текстовый файл, включающий тысячи строк, и каждая строка имеет 899 значений /столбцов, разделенных ';' (но я могу изменить разделение, если необходимо)

Есть ли способ прочитать определенный столбец (я хочу сказать, какой код (для каждого столбца), не считывая всю строку в переменные?

Итак, что я знаю: читать (единица, *) a, b, c, d, e, ... (899 раз это не круто) в противном случае я бы поместил все эти значения в массив. И после того, как я смог прочитать мой столбец с помощью: array (i, icolumn)

Я бы хотел прямой путь.

    
1
  1. Знаете ли вы, в каком столбце (как в символах) значение, которое вы хотите прочитать? Обычно ответом будет чтение вашей строки в строку символов и ее анализ, но в особых случаях вам может повезти. Вам НЕ нужно анализировать все вейлы и сохранять их в массиве.
    2019-05-02 15: 15: 16Z
  2. Я не уверен, что понимаю ваш вопрос. моя линия выглядит следующим образом: 2.75420e + 002; 2.75327e + 002; 2.75281e + 002; 2.75178e + 002; 2.75052e + 002; 2.74908e + 002; 2.74847e + 002; 2.74761e + 002; 2.74689e + 002; 2.74497e + 002; .... и тд. так что есть фиксированное количество символов. И да, я хочу определенный столбец, например 165. Поэтому моя программа должна спросить меня, какой столбец я хочу. затем я пишу 165. Затем он читает только столбец 165 в новый файл
    2019-05-02 15: 28: 16Z
  3. Хотя не Fortran, я думаю, что некоторые команды (если доступны) могут быть более удобными ... (например, "cut -f 165 -d \; matrix.dat")
    2019-05-02 16: 06: 24Z
2 ответа                              2                         

Если вы знаете, что число находится в символе 165, тогда вы просто используете дескриптор t или tr или x, чтобы переместиться туда и прочитать число

read(unit,'(t165,f12.0)' array(whatever)

если вам нужно поместить число 165 в строку формата, вы можете использовать эту функцию .

    
1
2019-05-02 20: 10: 00Z
  1. хорошо, это может сработать, если я что-то изменю. Можно ли использовать переменную для этого? Я имею в виду: моя программа спрашивает, какая ячейка, затем я набираю 165 в переменную X, а затем программа использует: read (unit, '(t "variableX", f12.0)' array (что угодно)
    2019-05-05 16: 12: 03Z
  2. @ TomLucas Читали ли вы конец предложения, включая ссылку? Но в моем коде число после t НЕ является номером ячейки CSV. Это столбец текстового файла!
    2019-05-05 16: 16: 02Z
  3. Да, я красную ссылку, но не очень хорошо понимаю. (165 - просто пример. Если я хочу 165-ю ячейку, я умножаю ее на 13 (количество цифр), это не проблема:)
    2019-05-05 16: 32: 48Z
  4. read(unit,'(t'//itoa(variableX)//',f12.0)' array(whatever), но вы можете использовать любой другой из этих методов в ссылке. В основном это stackoverflow.com/questions/9881186/...
    2019-05-05 16: 37: 49Z
  5. аааа, ваш itoa меняет целое число на символ? Хорошо, я был немного смущен, сри ...
    2019-05-05 17: 43: 49Z

Мойфайл данных testdata.dat выглядит следующим образом:

2.75420e+002;2.75327e+002;2.75281e+002;2.75178e+002;2.75052e+002;2.74908e+002;2.74847e+002;2.74761e+002;2.74689e+002;2.74497e+002
2.75420e+002;2.75327e+002;2.75281e+002;3.75178e+002;2.75052e+002;2.74908e+002;2.74847e+002;2.74761e+002;2.74689e+002;2.74497e+002
2.75420e+002;2.75327e+002;2.75281e+002;4.75178e+002;2.75052e+002;2.74908e+002;2.74847e+002;2.74761e+002;2.74689e+002;2.74497e+002

То есть 10 значений на строку и 3 строки, и обратите внимание, как я изменил значения четвертого столбца по сравнению с вашими исходными данными.

Моя программа для чтения запрашивает у пользователя колонку для чтения:

program readspeccol

integer :: readcol, i,j
double precision :: a(3)   ! 3 = number of lines in file
character(len=1) :: junk


print *,'input column:'
read(5,*) readcol

open(unit=15, file='testdata.dat')

do i = 1, 3
  read(15,'(10(es12.5,1a))') (a(i),junk, j=1,readcol)
  ! 10 = number of values in line
enddo


print *, a


end program readspeccol

Если я скажу прочитать четвертый столбец, выполнение будет следующим:

$>  ./a.out
 input column:
4
   275.17800000000000        375.17800000000000        475.17800000000000  

Эта программа может быть доработана, но я думаю, что это в основном то, что вы ищете.

    
0
2019-05-02 18: 22: 29Z
  1. На самом деле нет необходимости читать весь мусор. Плохой процессор должен делать преобразования из строк в числа ни за что. Кроме того, указание ненулевого d в esw.d может привести к неожиданным результатам, когда число на входе не содержит десятичной точки.
    2019-05-02 20: 06: 53Z
источник размещен Вот