Чтение двумерного массива - PullRequest
2 голосов
/ 18 июля 2011

Я пытаюсь прочитать двумерный массив (30.7) из внешнего файла в Fortran 90 как

READ(*,*)Fname

OPEN(UNIT=10, FILE=Fname, ACTION="READ")

   DO i=1,30

      READ(10,*)(indices(i,j),j=1,7)
  END DO

В данных отсутствуют некоторые значения, представленные как пустые.Когда я читаю данные в массив (,*)(indices(i,j)), он назначает 0.00 для отсутствующих данных.Как преодолеть эту проблему?Прикрепление данных ниже.

337.60,220.40,0.00,0.00,200.42,216.61,261.04
323.00,249.20,65.30,0.00,201.93,210.91,309.98
116.80,474.80,0.00,0.00,203.43,215.76,234.93
72.10,505.90,0.00,0.00,204.93,215.72,233.47
148.30,771.70,0.00,0.00,206.44,217.00,239.05
90.70,287.20,0.00,0.00,207.94,215.43,216.85
337.20,334.50,10.20,0.00,209.45,226.85,306.57
142.50,142.80,0.00,0.00,210.95,240.09,240.31
279.10,289.60,51.80,0.00,212.45,227.75,262.30
273.60,337.70,0.00,0.00,213.96,256.86,223.66
332.40,425.60,0.00,0.00,215.46,238.36,237.63
45.70,299.30,0.00,0.00,216.96,223.92,241.41
49.10,529.40,0.00,0.00,218.47,235.81,282.17
185.30,331.80,38.00,0.00,219.97,235.81,309.29
552.90,454.80,0.00,0.00,221.47,224.60,269.09
176.20,441.60,0.00,0.00,222.98,232.44,293.95
170.00, ,0.00, , , ,327.96
200.00, ,0.00, , , ,291.69
241.20,156.00,0.00,0.00,227.49,235.55,278.66
118.00,383.20,3.20,0.00,228.99,269.28,325.31
62.00,189.70,0.00,0.00,230.50,248.73,266.95
400.20,244.20,0.00,0.00,232.00,239.70,271.27
163.70,826.60,0.00,500.00,233.50,245.06,294.98
250.40,236.60,0.00,0.00,235.01,261.72,288.24
51.30,684.20,0.00,0.00,236.51,245.06,237.37
412.50,128.90,0.00,500.00,238.01,245.16,268.66
452.00, , , , , ,314.68
481.00,155.50,0.00,0.00,241.02,278.72,348.44
162.20,201.90,0.00,500.00,242.52,250.36,255.58
171.80,152.00,0.00,500.00,244.03,246.85,339.06

Ответы [ 3 ]

3 голосов
/ 20 июля 2011

Перед циклом DO присвойте массиву индексов уникальное значение, которое, как вы знаете, не будет присутствовать в наборе данных. Пример:

    indices = -99.
    DO J=1,30
        Read(1,*) indices(J,:)
    END DO

Недостающие значения в индексах по-прежнему будут иметь значение -99 после чтения файла. Затем вы можете подсчитать число -99 в каждом столбце.

0 голосов
/ 27 февраля 2015

try: open (unit = 10, file = ... blank = blank)

Не знаю, работает ли это, но blank = "zero" сбрасывает ваши пробелы в 0 ... предположим, что мое решение поступит наоборот;)

0 голосов
/ 18 июля 2011

Метод списка имен может пропускать непредусмотренные значения, но это имеет очень специфический формат. В противном случае, если вы хотите пропустить непредоставленные значения и пропуски не интерпретируются как ноль, вам придется предоставить свой дополнительный уровень обработки. Интерпретация пробелов как нуля на числовом вводе - это путь Фортрана Я думаю, что вы в основном должны написать свой собственный парсер. Прочитайте строки в строку, затем разделите их на подстроки через запятую (или пробелы тоже?). Если подстрока пуста, оставьте значение без изменений - это то, что вы хотите? В противном случае используйте «внутреннее» чтение, чтобы прочитать значения из строки в число. Не тривиально, но вы хотите сделать что-то нестандартное. Просмотрите строковые встроенные функции, поставляемые с Fortran, они облегчат обработку.

...