Хитрый разбор файлов. Несовместимые разделители - PullRequest
0 голосов
/ 16 марта 2010

Мне нужно проанализировать файл в следующем формате.

0000000 ...ISBN.. ..Author.. ..Title.. ..Edit.. ..Year.. ..Pub.. ..Comments.. NrtlExt Nrtl Next Navg NQoH UrtlExt Urtl Uext Uavg UQoH ABS NEB MBS FOL 
ABE0001 0-679-73378-7 ABE WOMAN IN THE DUNES (INT'L ED) 1st 64 RANDOM 0.00 13.90 0.00 10.43 0 21.00 10.50 6.44 3.22 2 2.00 0.50 2.00 2.00 ABS 

ID и ISBN не проблема, название есть. Для этих полей нет заданной длины и сплошных разделителей - пространство можно использовать для большей части файла.

Другая проблема заключается в том, что в поле для комментариев не всегда есть запись. Когда есть, есть интервал внутри контента.

Так что я могу получить первые два и последние четырнадцать. Мне нужна помощь, чтобы разобраться, как разобрать средние шесть полей.

Этот файл был сгенерирован более старой программой, которую я не могу изменить. Я использую php для разбора этого файла.

Ответы [ 5 ]

1 голос
/ 16 марта 2010

Найдите название и издателя книги по ISBN (в некоторой онлайновой базе данных) и проанализируйте только остальные:)

КСТАТИ. Вы уверены, что пространство выглядит как пространство? Есть более «невидимые» символы (например, пробел без пробелов). Я знаю, не очень хорошая идея, но, видимо, автор этого формата был довольно креативным ...

1 голос
/ 16 марта 2010

Я бы также спросил себя: «Насколько это должно быть хорошо» и «Сколько существует записей»?

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

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

(На моей первой работе мы потратили шесть недель на проект преобразования данных для преобразования 150 записей - нецелесообразное использование времени).

0 голосов
/ 16 марта 2010

Хотя я не вижу другого пути, кроме как догадываться, я бы сказал об этом примерно так:

Я бы уменьшил то, что я знаю, я могу надежно разобрать. Оставив тебя с ABE WOMAN IN THE DUNES (INT'L ED) 1st 64 RANDOM

Оттуда я бы попытался найти издание и разделить строку на две части в этой позиции после сохранения и удаления издания, оставив вам ABE WOMAN IN THE DUNES (INT'L ED) & 64 RANDOM, другой вариант - попытаться указать год, но, конечно же, заголовки. например, 1984 может представлять проблему. (Гадание, конечно, предполагает, что оно будет 7-м, 51-м и т. Д. Для всех выпусков).

Наконец, я бы предположил, что смогу достаточно надежно угадать год 64 в начале второй строки и еще больше ограничить часть Publisher (/ Comment).

Все остальное - просто догадки, если у вас нет списка авторов / издателей, с которым можно было бы сравнивать, поскольку я предполагаю, что есть не только комментарии с пробелами, но и издатели с пробелами в их именах. Но по крайней мере у вас должно быть до 2 строк, содержащих Автор / Заголовок в одном и Издатель (/ Комментарии) в другом.

В целом, это должно немного ограничить ручную часть.

Как только я это сделаю, я также сохраню его в лучшем формате где-нибудь, чтобы мне больше не приходилось анализировать его;)

0 голосов
/ 16 марта 2010

Я не знаю, позволяет ли механизм pcre использовать несколько групп в пределах выделения, поэтому:

([A-Z0-1] {7}) \ (\ d- \ d {3} - \ d {5} - \ d) \ (. +) \ (\ d (?: st | nd | rd)) \ \ d {2} \ ([^ \ d.] +) \ (\ d +. \ d {2}) \ (\ d +. \ d {2}) \ (\ d +. \ d {2}) \ (\ d +. \ d {2}) \ (\ d {1}) \ (\ d +. \ d {2}) \ (\ d +. \ d {2}) \ (\ d +. \ d {2}) \ (\ d +. \ d {2}) \ (\ d) \ (\ d +. \ d {2}) \ (\ d +. \ d {2}) \ (\ d +. \ d {2}) \ (\ d +. \ d {2}) \ (\ Ш {3})

Это выглядит довольно некрасиво и не решает вашу проблему с названием автора, но в остальном оно вполне подходит. Что касается вашей проблемы, я не вижу никакого решения, кроме наличия справочной таблицы для авторов или использования других служб для поиска заголовка и автора через ISBN.

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

0 голосов
/ 16 марта 2010

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

...