Отделение текста ASCII от двоичного содержимого в файле

У меня есть файл с текстом ASCII и двоичным содержимым. Я хотел бы извлечь текст без разбора двоичного содержимого, поскольку двоичное содержимое составляет 180 МБ. Могу ли я просто извлечь текст для дальнейших манипуляций... как лучше всего это сделать.

ASCII находится в самом начале файла.


person Ankur    schedule 12.02.2010    source источник
comment
Как разделены две части?   -  person John Feminella    schedule 12.02.2010
comment
Когда я смотрю на необработанный файл, кажется, что первая строка - это ASCII, а остальные - двоичные, поэтому было бы достаточно просто прочитать первую строку. Я предполагаю, что это, вероятно, быстрое и грязное решение. Мне интересно, есть ли способ определить, что код ASCII остановился и начался двоичный код?   -  person Ankur    schedule 12.02.2010
comment
Тогда просто прочитайте первую строчку. Это меньше душевных страданий и является правильным решением, если оно всегда ограничено разрывом строки.   -  person John Feminella    schedule 12.02.2010
comment
Каков формат файла? Общий формат потенциально может иметь структуру для извлечения этих данных.   -  person Tim R    schedule 12.02.2010
comment
Это файл FITS - если есть структура для извлечения данных, это было бы здорово.   -  person Ankur    schedule 12.02.2010
comment
Также взгляните на разбор HTTP-запросов. Принципы аналогичны.   -  person finnw    schedule 12.02.2010


Ответы (6)


Существует 4 библиотеки для чтения файлов FITS в Java здесь:

Ява

Классы nom.tam.fits

Была разработана библиотека Java FITS, которая обеспечивает эффективный — по крайней мере для Java — ввод-вывод для изображений FITS и двоичных таблиц. Библиотеки Java поддерживают все основные форматы FITS и сжатые файлы gzip. Включена поддержка доступа к подмножествам данных, и можно использовать соглашение HIERARCH.

eap.fits

Включает апплет и приложение для просмотра и редактирования файлов FITS. Также включает пакет общего назначения для чтения и записи данных FITS. Он может читать зашифрованные файлы PGP, если доступен необязательный файл jar PGP.

jfits

Библиотека jfits поддерживает изображения FITS, а также ASCII и двоичные таблицы. Поддерживается оперативная модификация ключевых слов и данных.

СТИЛЬ

Библиотека табличного ввода-вывода общего назначения на чистом Java, которая может читать и записывать двоичные таблицы FITS среди других форматов таблиц. Он эффективен и может обеспечить быстрый последовательный или произвольный доступ для чтения к таблицам FITS, намного большим, чем физическая память. Нет поддержки образов FITS.

person OscarRyz    schedule 12.02.2010

Я не знаю ни одного класса Java, который будет читать символы ASCII и игнорировать остальные, но самое простое, что я могу здесь придумать, это использовать утилиту strings (при условии, что вы работаете в системе на основе Unix).

СИНТАКСИС строки [-] [-a] [-o] [-t формат] [-число] [-n число] [--] [файл ...]

ОПИСАНИЕ Strings ищет строки ASCII в двоичном файле или стандартном вводе. Строки полезны для идентификации случайных объектных файлов и многих других вещей. Строка — это любая последовательность из 4 (по умолчанию) или более печатных символов, заканчивающаяся символом новой строки или нулем. Если не задан флаг -, строки просматриваются во всех разделах объектных файлов, кроме раздела (__TEXT,__text). Если файлы не указаны, читается стандартный ввод.

Затем вы можете передать вывод в другой файл и делать с ним все, что хотите.

Редактировать: с дополнительной информацией о том, что все символы ASCII идут в начале, было бы немного проще извлечь текст программно; тем не менее, это быстрее, чем писать код.

person danben    schedule 12.02.2010
comment
Вы будете принимать несколько таких файлов в качестве входных данных? - person danben; 12.02.2010

Предполагая, что вы можете сказать, где находится конец содержимого ASCII, просто читайте символы из файла, пока не найдете его конец, и закройте файл.

person Anon.    schedule 12.02.2010
comment
Проблема заключается в том, чтобы выяснить, как определить, где находится конец содержимого ASCII. - person Ankur; 12.02.2010
comment
Нет простого пути. Лучшее, что вы можете сделать, это остановиться, когда вы встретите первый непечатаемый символ (потому что вы знаете, что он не будет в разделе ASCII), но тогда вы все равно, вероятно, подберете какой-то мусор в начале двоичного раздела. до этого. Было бы лучше, если бы вы знали точную структуру двоичной секции — скажем, если бы она всегда начиналась с одной и той же последовательности символов. Затем вы можете найти это, чтобы определить, где заканчивается раздел ASCII. - person Anon.; 12.02.2010

Предположим, что есть какой-то токен, который делит файл на двоичный и ASCII-компоненты (скажем, "#END#" в отдельной строке), вы можете сделать что-то вроде следующего:

import java.io.*;

// ...

public static void main(String args[]) {
  try {
    FileInputStream f = new FileInputStream("object.bin");
    DataInputStream d = new DataInputStream(f);
    BufferedReader b = new BufferedReader(new InputStreamReader(d));

    String s = "";
    while ((s = b.readLine()) != "#END#") {
      // ASCII contents parsed here.
      System.out.println(s);
    }

    d.close();
  } catch (Exception e) {
      System.err.println("kablammo! " + e.getMessage());
  }
}
person John Feminella    schedule 12.02.2010
comment
€ Кажется, что это первый символ очень часто, возможно, я мог бы использовать это. - person Ankur; 12.02.2010

Имейте метод, который проверяет, соответствует ли конкретный символ вашим критериям (здесь я рассмотрел символы, которые можно найти на клавиатуре). Как только вы нажмете символ, для которого метод возвращает false, вы знаете, что нажали двоичный файл. Обратите внимание, что допустимые символы ASCII также могут являться частью двоичного файла, поэтому в конце вы можете получить несколько дополнительных символов.

static boolean isAsciiCharacter(char c) {
    return (c >= ' ' && c <= '~') ||
            c == '\n' ||
            c == '\r';
}
person lins314159    schedule 12.02.2010
comment
Спасибо, это будет очень полезно - person Ankur; 12.02.2010

Первые 2880 байт файла FITS представляют собой данные заголовка ASCII, представляющие 36 80-столбцовых «изображений карточек». Здесь нет символов конца строки, просто массив ASCII 36x80, при необходимости дополненный пробелами. Могут быть дополнительные 2880-байтовые заголовки ASCII, предшествующие двоичным данным; вам нужно будет проанализировать первый набор заголовков, чтобы узнать, сколько ASCII ожидать.

Но я полностью поддерживаю совет Оскара Рейеса использовать существующий пакет для декодирования файлов FITS! Два упомянутых им пакета размещены в Центре космических полетов имени Годдарда НАСА, который также отвечает за поддержание формата FITS. Это самый точный источник, который вы можете получить.

person Jim Lewis    schedule 12.02.2010