Разбор PDF таблиц в CSV с помощью PHP - PullRequest
1 голос
/ 03 июня 2019

Мне нужно преобразовать PDF-файл с таблицами в CSV, поэтому я использовал «PDFPARSER», чтобы проанализировать весь текст, а затем с помощью pregmatch_all выполнить поиск по шаблонам каждой таблицы, чтобы я мог создать массив из каждой таблицы в формате PDF..

Структура следующего PDF-файла:

image

Когда я анализирую, я получаю это

ECO-698 Acondicionador Frio-Calor ECO-CHI-522 Chimenea eléctrica con patas

Я разобрался, как предсказать все ECO-XXXXX, но я не знаю, как скомпилировать все описания

Это то, что работает для ECO-XXXXXX

$parser = new \Smalot\PdfParser\Parser();
$pdf    = $parser->parseFile('publication.pdf');

$text = $pdf->getText();
echo $text;

$pattern = '/ECO-[.-^*-]{3,}| ECO-[.-^*-]{4,}\s\b[NMB]\b|ECO-[.-^*-]{4,}\sUP| ECO-[.-^*-]{3,}\sUP\s[B-N-M]{1}| ECO-[.-^*-]{3,}\sRX/' ;
preg_match_all($pattern, $text, $array);

echo "<hr>";
print_r($array);

Я получаю

Array ( [0] => Array ( [0] => ECO-698 [1] => ECO-CHI-522 [2]

1 Ответ

1 голос
/ 03 июня 2019

Вы можете попробовать это регулярное выражение:

(ECO[^\s]+)\s+(.*?)(?=ECO|\z)

Согласно входной строке, group1 содержит блок ECO, а группа 2 содержит описания.

Объяснение:

  1. (ECO[^\s]+) захватить полный блок ECO, пока он не достигнет пробела.
  2. \s+ один или несколько пробелов
  3. (.*?)(?=ECO|\z) Здесь (. *?) Соответствует описанию и (?=ECO|\z) является положительным прогнозом на совпадение ECO или конца строки (\z)

Regex101

Исходный код ( Выполнить здесь):

$re = '/(ECO[^\s]+)\s+(.*?)(?=ECO|\z)/m';
$str = 'ECO-698 Acondicionador Frio-Calor ECO-CHI-522 Chimenea eléctrica con patas';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
$val=1;
foreach ($matches as $value)
    {

        echo "\n\nRow  no:".$val++;
        echo "\ncol 1:".$value[1]."\ncol 2:".$value[2];

    }

ОБНОВЛЕНИЕ КАК в комментарии:

((?:ECO-(?!DE)[^\s]+)(?: (?:RX|B|N|M|UP|UP B|UP N|UP M))?)\s+(.*?)(?=(?:ECO-(?!DE))|\z)

Regex 101 обновлено

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...