Чтение файла CSV разной точности в Fortran

Я использую внешнюю программу для запуска моделирования, которое возвращает мне CSV-файл, содержащий выходные данные. Мне нужно прочитать данные из этого файла в мою программу на фортране, которая анализирует и оптимизирует входные условия для повторного запуска внешней программы.

Файл CSV имеет, скажем, 20 столбцов и 70 строк. Каждый столбец содержит выходные данные для определенного параметра. Поскольку эта программа написана не мной, я не могу контролировать точность выходных значений. Поэтому во многих случаях внешняя программа усекает количество цифр после запятой, если они равны нулю. Так что возможно в прогоне № 1 определенное поле имеет 3 цифры после запятой, но имеет только 2 цифры после запятой в прогоне № 2.

Что я должен сделать для этого? Я не могу использовать команду чтения, так как мне нужно заранее указать количество цифр, которые моя программа должна прочитать.

Мне в основном нужен способ, чтобы моя программа могла идентифицировать данные между запятыми и считывать значение или различную точность между запятыми.


person AKP    schedule 19.01.2016    source источник
comment
Мне нужно заранее указать количество цифр, которое должна прочитать моя программа Не всегда. Попробуйте ввод по списку, например. read(unit,*) c1, c2, c3, ... То есть использовать * как формат для чтения.   -  person High Performance Mark    schedule 19.01.2016
comment
Я не понимаю вашей проблемы. У вас есть сообщение об ошибке или что-то в этом роде? Как выглядит код и входной файл?   -  person Vladimir F    schedule 19.01.2016
comment
@ Марк, спасибо ... и да, на самом деле так и сделал. Не хотел по разным причинам. Но пришлось.. Спасибо!   -  person AKP    schedule 19.01.2016


Ответы (1)


Для ввода десятичная часть спецификатора формата используется только если поле ввода не содержит десятичной точки.

В течение последних нескольких десятилетий (с момента исчезновения перфокарт) пользователи обычно ожидают, что числовое значение, не содержащее десятичную точку, является целым числом. Следовательно, в спецификациях формата для действительных чисел всегда должно быть .0 для их десятичной части.

Например, после:

CHARACTER(4) :: input
REAL :: a, b
input = '1   '
READ (input, "(F4.0)") a
READ (input, "(F4.1)") b

a будет иметь значение 1,0, а b будет иметь значение 0,1.

(Для ввода не имеет особого значения, какой конкретный дескриптор реальных данных используется (F, E, D или G) — все они ведут себя одинаково независимо от характера ввода.)

Таким образом, для ввода все, о чем вам нужно беспокоиться, это правильная ширина поля. После того, как вы прочитали запись в строку, это достаточно легко сделать с помощью встроенной функции INDEX.

person IanH    schedule 19.01.2016