2016-01-19 5 views
0

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

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

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

Мне нужна программа для определения данных между запятыми и чтения значений или различной точности между запятыми.

+1

* Мне нужно заранее указать количество цифр, которое моя программа должна читать * Не всегда. Попробуйте ввести * list-direct *, например. 'read (unit, *) c1, c2, c3, ...' То есть, используйте '*' в качестве формата для чтения. –

+0

Я не понимаю вашу проблему. У вас есть сообщение об ошибке или что-то еще? Как выглядит код и входной файл? –

+0

@Mark, Спасибо ... и да На самом деле это закончилось. Не хотел по разным причинам. Но пришлось ... Спасибо, хотя! – AKP

ответ

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, Е, D или G), - все они ведут себя одинаково, независимо от характера входных данных.)

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

Смежные вопросы