| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Fortran > Извлечение данных |
| Автор: spea 27.10.2012, 13:36 |
| Большая просьба к знающим этот язык. Имеется исходный файл, содержащий данные. Но в файле совершенно непонятная кодировка. AkelPad сообщает, что файл бинарный. И есть http://earth-info.nga.mil/GandG/wgs84/gravitymod/egm2008/Anomaly_DOV/read_1file_min5.0 на Fortran для извлечения данных из этого файла. Языки программирования почти не знаю , и разобраться как работает эта программа совершенно не получается. Пробовал её скомпилировать в Force 2.0, но выскакивает масса ошибок. По идее, в сам код нужно вносить какие-то параметры для извлечения данных из файла. Если вас не затруднит, посмотрите пожалуйста, что именно нужно сделать, чтобы извлечь данные. Исходные данные и программа находятся по адресу http://earth-info.nga.mil/GandG/wgs84/gravitymod/egm2008/anomalies_dov.html Там где написано "5 x 5-Minute Area-Mean Free-Air Gravity Anomaly Grid (Dg01_mean5.0x5.0_EGM08_to2190_WGS84_ell_nh - 36 MB)" - это исходные данные. "Program to Read 5-Minute Gravity Anomaly Grid (read_1file_min5.0 - 6 KB)" - текст программы. "Output from the Program Above (read_1file_min5.0.out01 - 7 KB)" - пример работы этой программы |
| Автор: Фантом 27.10.2012, 17:21 | ||
| Во-первых, то, что на сайте называется "программой", на самом деле представляет собой программу на Фортране, встроенную в скрипт ksh, причем внешняя "обвязочная" часть написана, да простят меня модераторы, через задницу. Неудивительно, что скомпилировать эту химеру не удалось. Похоже, что кто-то когда-то написал код на Фортране, а уже затем кто-то другой, с Фортраном не знакомый, приделал снаружи костыли вместо переделки собственно программы. Во-вторых, собственно фортрановский исходник также писался как минимум двумя разными людьми, причем первый из них использовал стандарт FORTRAN 77 (и делал все аккуратно), а второй - FORTRAN 90 (и опять-таки через задницу). Соответственно, если все это зачистить, собрать и запустить, то получается следующее:
Звездочки - там, где результаты не влезли в заданный формат. В принципе, если надо, я могу исправить и это... |
| Автор: spea 27.10.2012, 17:32 | ||||||
Мне на одном форуме также подсказали, что это не листинг.
|
| Автор: Фантом 27.10.2012, 18:35 |
| Скорее не ошибка, а особенность интерпретации двоичных данных. Собственно, судя по тексту программы, она должна считывать из файла с данными 2160*4320 вещественных чисел, по 4 байта на число. Проблема в том, что на разных платформах форма хранения вещественных чисел может быть разной (у меня в итоге получаются отсчеты, различающиеся порядков на 60, что, наверное, не слишком осмысленно). Можно попробовать подобрать форму, однако для этого нужно знать, какими примерно по величине могут быть данные. Вы можете это сообщить? |
| Автор: spea 27.10.2012, 18:47 | ||||
Или общее количество строк данных нужно знать? 3110400 строк, что соответствует 2160*4320 разделить на 3 столбика. Если скомпилировать этот код, то получается почти как в примере, только в третьей колонке сначала 0,00000, затем данные смещены вниз на одну строчку.
|
| Автор: spea 27.10.2012, 19:48 | ||
как
89.9583333333 0.0416666667 3.25491 89.9583333333 0.1250000000 3.24581 89.9583333333 0.2083333333 3.23676 89.9583333333 0.2916666667 3.22776 89.9583333333 0.3750000000 3.21880 89.9583333333 0.4583333333 3.20989 89.9583333333 0.5416666667 3.20103 89.9583333333 0.6250000000 3.19221 89.9583333333 0.7083333333 3.18345 89.9583333333 0.7916666667 3.17473 |
| Автор: spea 27.10.2012, 20:49 | ||
Вычислил, что в начале должно быть так
Открывается также как и в примере. Вопрос в том, как записать данные в нормальном формате в текстовый файл? |
| Автор: Фантом 27.10.2012, 21:07 | ||||
Точнее, в последнем столбце примера. Т.е. что-то порядка единицы? Тогда байты надо расставлять в обратном порядке. Получается то, что в примере, но опять-таки со сдвигом 3-го столбца на одну позицию. Если считать, что первые четыре байта в данных пустые (на что очень похоже - файл чуть длиннее, чем требуется), то получается соответствие. Вот простенькая программа на C99, которая перелопачивает исходный файл (переименованный в data.dat) в текстовое представление:
Если хотите, могу и результат выслать, но напишите, куда - он и в ужатом виде больше 20М. |
| Автор: spea 27.10.2012, 21:19 | ||
Только что её скомпилировал. В результирующем файле почему-то не все точки. Должно быть 3110400 строк, а получается 2562816. Напутал я с числом строк, их как раз должно быть 9331200=2160*4320 |
| Автор: Фантом 27.10.2012, 21:53 | ||
Откуда? Там в цикле читается 2160*4320 блоков по четыре байта. Соответственно, должно получаться 9331200 строк (столько, собственно, и получается). |
| Автор: spea 27.10.2012, 21:54 | ||||
Немного подправил код
Теперь строчек, сколько нужно. Фантом, огромнейшее спасибо! Вы меня невероятно выручили. Добавлено @ 22:01
Вот только у меня получается заархивированный 50M, не сжатый 300M. |
| Автор: Фантом 27.10.2012, 22:07 |
По идее разницы быть не должно. Может быть, у Вас оптимизация компилятора хулиганит? Аналогично. Я просто в первый раз прервал программу раньше и ужимал только то, что успело получиться к тому моменту. Потому и написал "больше". |
| Автор: spea 27.10.2012, 22:12 | ||
|
| Автор: spea 28.10.2012, 00:58 | ||||
| Столкнулся с такой проблемой. Через каждые 4320 точек встречается 2 пары нулей в третьем столбце. И остальные данные получаются смещёнными на 2 строчке и это смещение накапливается. Вот пример резкого перепада:
0.00000 далее 4320 нужных значений 0.00000 0.00000 далее 4320 нужных значений 0.00000 и т.д. |
| Автор: spea 28.10.2012, 01:56 |
| Фантом, проверьте пожалуйста, получается ли у вас без нулей? upd. Немного коряво, но итогового результата добился. Считал исходный файл "как есть" на 2160*4320+4320 строк, не создавая первые два столбца. Затем удалил 4320 нулей. Занёс полученные данные в массив и присоединил его к первым двум столбцам. Получилось то, что нужно: всё совпало, смещений и нулей нет. Буду рад, если подскажите более простое решение. Хотя, в принципе, можно считать что проблема решена. P.S. Извиняюсь за оверпостинг. Думал, что сообщение приклеится к предыдущему. |