Разбор структуры данных в текстовом файле - PullRequest
1 голос
/ 09 февраля 2010

Как бы вы проанализировали в Java структуру, подобную этой


\\Header (name)\\\
1JohnRide  2MarySwanson
 1 password1
 2 password2
\\\1 block of data name\\\
  1.ABCD
  2.FEGH
  3.ZEY
\\\2-nd block of data name\\\
1. 123232aDDF dkfjd ksksd
2. dfdfsf dkfjd
....
etc

Предположим, это из текстового буфера (простой файл).

Каждая строка текста ограничена "\ n". Между словами используется пробел.

Структура более или менее определена. Неоднозначность иногда может быть, однако, случаем Количество полей в каждой строке информации может быть разным, иногда быть некоторым блоком данных, и число строк в каждом блоке также может варьироваться.

Вопрос в том, как сделать это наиболее эффективно?

Первое решение, которое приходит мне в голову, - это использовать регулярные выражения.

Но есть ли другие решения? Проблемно-ориентированный? Может быть, какая-то библиотека Java уже написана?

Ответы [ 5 ]

2 голосов
/ 17 февраля 2010

Поскольку никто не рекомендовал какую-либо библиотеку, я бы предложил: используйте REGEX.

1 голос
/ 02 апреля 2016

Выезд из ЮТА: https://github.com/sonalake/utah-parser

Это инструмент, который довольно хорошо разбирает этот полуструктурированный текст

0 голосов
/ 09 февраля 2010

Из того, что вы опубликовали, похоже, что данные разделены пробелами. Одна идея состоит в том, чтобы использовать Scanner или StringTokenizer для получения одного токена за раз. Затем вы можете проверить первый char токена, чтобы увидеть, является ли он цифрой (в этом случае часть токена после цифры (цифр) будет являться данными, если они есть).

0 голосов
/ 09 февраля 2010

Это звучит как домашнее задание, поэтому я постараюсь ответить на него таким образом, чтобы помочь вам (а не дать окончательное решение).

Во-первых, вам нужно рассмотреть каждый объект данных, которые вы читаете. Это число тогда текстовое поле? А число тогда 3 текстовых поля? Номера переменных и текстовые поля?

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

Если объект может проходить через несколько строк, вам нужно помнить об этом (не останавливаться на полпути через объект).

Надеюсь, это поможет. Если вы исследуете это, и у вас все еще есть проблемы, опубликуйте код, который у вас есть, и некоторые примеры данных, и я помогу вам решить ваши проблемы (я научу вас ловить рыбу ... не давать вам рыбу :-)).

0 голосов
/ 09 февраля 2010

Если поля имеют фиксированную длину, вы можете использовать DataInputStream для чтения вашего файла. Или, поскольку ваш формат основан на строках, вы можете использовать BufferedReader, чтобы читать строки и написать себе конечный автомат, который знает, какую строку ожидать в будущем, учитывая то, что она уже видела. Если у вас есть каждая строка в виде строки, вам просто нужно соответствующим образом разделить данные.

Например, пароль можно получить из строки пароля следующим образом:

final int pos = line.indexOf(' ');
String passwd = line.substring(pos+1, line.length());
...