Чтение двумерного массива

Я пытаюсь прочитать двумерный массив (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

person user849483    schedule 18.07.2011    source источник
comment
Что вы хотите сделать с отсутствующими данными?   -  person Jonathan Dursi    schedule 18.07.2011
comment
возможный дубликат массив Fortran90 считывает пустые значения как null   -  person Jonathan Dursi    schedule 18.07.2011
comment
В зависимости от количества пробелов подсчитывается количество пробелов, например, в столбце 2 отсутствует 3, тогда coult будет 27 и так далее. Как я могу пропустить цикл, если я найду пропущенное значение.   -  person user849483    schedule 18.07.2011


Ответы (3)


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

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

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

person bananafish    schedule 20.07.2011

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

person M. S. B.    schedule 18.07.2011

попробуйте: открыть (блок = 10, файл =... пустой = пустой)

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

person Daniel    schedule 26.02.2015
comment
Пожалуйста, отформатируйте свой ответ, чтобы сделать код читабельным. И, пожалуйста, попробуйте опубликовать решения, которые более надежны, чем, вероятно, работают. - person ryanyuyu; 27.02.2015