У меня есть старая программа для Windows 95, которая экспортирует данные без номеров учетных записей, сезонных учетных записей, и если учетные записи содержат вспомогательную учетную запись.
Однако я могу распечатать информацию о клиенте и заметки, содержащие вышеуказанную информацию, в файл PDF и скопировать этот текст в блокнот; который я хотел бы извлечь данные.
Порядок данных: 1) заголовки страниц (мне эти данные не нужны.)
название компании
Информация для клиентов и заметки
Вычислено в понедельник, 10 августа 2015 года. Страница 1
2) стандартные заголовки и 3) данные после заголовков:
Имя Ser: Блок, Солнечный Маршрут: 1
Адрес: 3354 ASPEN RD. Частота: ежемесячно
Адрес: ST PETE, GA 33333 Неделя / день: Первый понедельник
Город Штат Zip: данные Время планирования (ЧЧ: ММ): 10: 00А
Ser Телефон: 555-1212 Обслуживание: ОСНОВНОЙ СЕРВИС
Законопроект о: БЛОК, СОЛНЕЧНЫЙ Оценить ($): 24,00
название компании
Информация для клиентов и заметки
Вычислено в понедельник, 10 августа 2015 г. Стр. 2
Адрес: 1123 Слай Термины: ДЕНЕЖНЫЕ СРЕДСТВА
Адрес: Ап Б
заметки: У Санни средняя собака
Не входите, если собака не выставлена
Затем он переходит к данным следующих клиентов и так далее.
Основные названия никогда не меняются, такие как имя, маршрут, адрес, заметки, телефон. Есть установленное количество заголовков в порядке; однако название заметки: может занимать 1-16 строк; и заголовок является случайным во всех данных. и хотя названия расположены по порядку, адрес называется 4 раза как для служебной строки 1 и строки 2, так и для адресов выставления счета — строка 1 и строка 2.
Я хотел бы установить переменные для этих названий и взять только то, что за ними; часть извлечения через PHP. Есть какой-либо способ сделать это?
Я не думаю, что это возможно для идеального решения, но FWIW, может быть, это достаточно хорошо для вас.
Без известного / надежного разделителя между клиентами я не могу придумать, как можно получить заметки, не добавляя заголовки для следующей компании, если только вы не можете сделать что-то, включающее большую справочную таблицу со всеми именами клиентов.
У меня есть (некрасивое) регулярное выражение, которое может надежно помочь, насколько другие вещи, хотя:
$content='[the contents of your file]';
preg_match_all('~(Ser Name|Route|Address|Frequency|Week/Day|City State Zip|Sched Time \(HH:MM\)|Ser Phone|Service|Bill to|Rate \(\$\)|Terms|notes):\s*((?:(?!Ser Name|Route|Address|Frequency|Week/Day|City State Zip|Sched Time \(HH:MM\)|Ser Phone|Service|Bill to|Rate \(\$\)|Terms|notes).)+)~is',$content,$matches);
Так что это в основном ищет «заголовок» и помещает в первую захваченную группу, а затем сопоставляет до следующего «заголовка» и помещает его во вторую захваченную группу.
Возможно, это достаточно хорошо для вас, но TBH Я не могу придумать ничего лучшего, что вы можете сделать, если вы не можете улучшить свое извлечение до лучшего формата.
Таким образом, ваш пример данных будет выводить:
Array
(
[0] => Array
(
[0] => Ser Name: Block, Sunny
[1] => Route: 1
[2] => Address: 3354 ASPEN RD.
[3] => Frequency: Monthly
[4] => Address: ST PETE, GA 33333
[5] => Week/Day: First Monday
[6] => City State Zip: data
[7] => Sched Time (HH:MM): 10:00A
[8] => Ser Phone: 555-1212
[9] => Service: BASIC SERVICE
[10] => Bill to: BLOCK,SUNNY
[11] => Rate ($): 24.00
Company Name
Customer Information and Notes
Computed Monday, August 10 2015 Page 2
[12] => Address: 1123 Sligh
[13] => Terms: CASH
[14] => Address: Apt B
[15] => notes: Sunny has a mean dog
)
[1] => Array
(
[0] => Ser Name
[1] => Route
[2] => Address
[3] => Frequency
[4] => Address
[5] => Week/Day
[6] => City State Zip
[7] => Sched Time (HH:MM)
[8] => Ser Phone
[9] => Service
[10] => Bill to
[11] => Rate ($)
[12] => Address
[13] => Terms
[14] => Address
[15] => notes
)
[2] => Array
(
[0] => Block, Sunny
[1] => 1
[2] => 3354 ASPEN RD.
[3] => Monthly
[4] => ST PETE, GA 33333
[5] => First Monday
[6] => data
[7] => 10:00A
[8] => 555-1212
[9] => BASIC SERVICE
[10] => BLOCK,SUNNY
[11] => 24.00
Company Name
Customer Information and Notes
Computed Monday, August 10 2015 Page 2
[12] => 1123 Sligh
[13] => CASH
[14] => Apt B
[15] => Sunny has a mean dog
)
)
Других решений пока нет …