Как разобрать текстовую таблицу в C ++ - PullRequest
4 голосов
/ 08 ноября 2010

Я пытаюсь проанализировать таблицу в виде текстового файла, используя ifstream, и оценивать / манипулировать каждой записью.Тем не менее, я не могу понять, как подойти к этому из-за упущений конкретных предметов.Рассмотрим следующую таблицу:

NEW  VER  ID   NAME
1    2a   4    "ITEM ONE" (2001)
     1    7    "2 ITEM" (2002) {OCT}
     1.1  10   "SOME ITEM 3" (2003)
1         12   "DIFFERENT ITEM 4" (2004)
1    a4   16   "ITEM5" (2005) {DEC}

Как видите, иногда в столбце «NEW» ничего нет.То, что я хочу сделать, это записать идентификатор, имя, год (в скобках) и заметить, есть ли фигурные скобки или нет.

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

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

Я делаю это, чтобы отточить свои навыки C ++ и работать с более крупными существующими наборами данных, поэтому я хотел бы использоватьC ++, если это возможно, но если другой язык (я смотрю на Perl или Python) делает это легко, я мог бы просто научиться взаимодействовать с другим языком с C ++.Сейчас я пытаюсь просто отсеивать данные, которые в конечном итоге станут объектами в C ++, поэтому у меня все еще есть шансы улучшить свои навыки в C ++.

РЕДАКТИРОВАТЬ: я также понимаю, что это можно завершить, используятолько регулярное выражение, но я хотел бы попробовать использовать различные методы манипулирования файлами / строками, если это возможно.

Ответы [ 2 ]

6 голосов
/ 08 ноября 2010

Если смещения столбцов действительно фиксированы (без вкладок, только истинные пробелы a la 0x20), я бы прочитал строку по очереди (string::getline) и разбил ее, используя фиксированные смещенияв набор из четырех строк (string::substr).

Затем выполните постобработку каждого 4-го набора строк, как требуется.

Я бы не стал жестко кодировать смещения, сохраняя их в отдельном входном файле, который описывает формат ввода - например, в таблицеописание в SQL Server или другой БД.

0 голосов
/ 08 ноября 2010

Примерно так:

  1. Прочитайте первую строку, найдите "ID" и сохраните индекс.
  2. Считайте каждую строку данных, используя std::getline().
  3. Создать подстроку из строки данных, начиная с индекса, который вы нашли "ID" в строке заголовка.Используйте это для инициализации std::istringstream с.
  4. Считайте идентификатор, используя iss >> an_int.
  5. Найдите первый ".Поиск второй ".Найдите ( и запомните его индекс.Найдите ) и запомните этот индекс.Создайте подстроку из символов между этими индексами и используйте ее для инициализации другого std::istringstream с помощью.Прочитайте номер из этого потока.
  6. Поиск брекетов.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...