Разбор данных из pdf и форматирование их в csv с использованием GREP / awk / sed - PullRequest
0 голосов
/ 21 февраля 2019

У меня Ubuntu 18.04, и я использую GREP и pdftotext для извлечения информации из файлов pdf.Я могу приблизиться к тому, чтобы получить то, что я хочу, но как новичок в этом, я изо всех сил пытаюсь улучшить это.Конечная цель - экспортировать эту информацию в таблицу Excel или SQL, поэтому форматирование и компоновка имеют решающее значение.Я использовал awk и sed, чтобы попытаться перейти прямо к csv, НО я получаю вкладки и пробелы, которые не чистые - не говоря уже о нормализации в полезной манере.У меня более 3000 таких отчетов.

Отчеты состоят из нескольких страниц и содержат некоторую информацию, которую я хотел бы проанализировать и сохранить в CSV-файле.Я могу успешно преобразовать PDF в текст, сохранить макет и удалить разрывы страниц.Я также могу получить информацию.довольно хорошо, но у меня проблемы с двумя вещами: 1. Включение отдельной части информации в начале отчета: Имя и Дата с информацией, которую я извлекаю;2. Передача информации в полезном формате CSV.Вот что я имею после преобразования pdf в текст:

Blah blah blah…
Blah blah blah…,

Date:       July 5/2009

Name:     Jerry Lewis

Blah, blah bla blah…
Blah, blah bla blah…
… and so forth…
Blah, blah bla blah…

Program       Signature       Style

ID      

3267-A0            DJFHJJHJHHL      Compact Flash

SJF98SDAS7  

Заголовки разделены пробелами / табуляциями.«ProgramID» разбит на две строки, как и значение подписи

Я хочу:

Date,Name,ProgramID,Signature,Style
July 5/2009,Jerry Lewis, 3267-A02, DJFHJJHJHHL SJF98SDAS7, Compact Flash

Конечная цель - экспортировать эту информацию в таблицу Excel или SQL, поэтому форматирование имакет имеет решающее значение.Я использовал awk и sed, чтобы попытаться перейти прямо к csv, НО я получаю вкладки и пробелы, которые не чистые - не говоря уже о нормализации в полезной манере.У меня более 3000 таких отчетов.То, что было бы супер-удивительным, - это сделать их все одновременно.Я вмешивался в рекурсивные операторы, чтобы преобразовать все PDF-файлы в папке в текст, и использовал команду linux, чтобы переместить PDF-файлы в целом в другой «обработанный» каталог, но это все.

Как я уже сказал,Я немного новичок, так что я даже не уверен, возможно ли это?- Спасибо

1 Ответ

0 голосов
/ 22 февраля 2019

К сожалению, большая часть того, что должен делать скрипт (т.е. избегать ложных совпадений), зависит от текста, для которого вы только что предоставили «бла», и от того, что вы подразумевали под «пробелами / табуляциями», когда писали The headers are separated by white space/tabs, но возможно это укажет вам правильное направление:

$ cat tst.awk
BEGIN {
    numTags = split("Date Name Program Signature Style",tagNr2name)
    for (tagNr=1; tagNr<=numTags; tagNr++) {
        tagName = tagNr2name[tagNr]
        tagName2nr[tagName] = tagNr
        tagNameColon2nr[tagName":"] = tagNr
    }
    FS = "[[:space:]]{2,}"
    OFS = ","
}

{ gsub(/^[[:space:]]+|[[:space:]]+$/,"") }

$1 in tagNameColon2nr {
    tagNr = tagNameColon2nr[$1]
    val = $0
    sub(/[^:]+:[[:space:]]+/,"",val)
    tagNr2val[tagNr] = val
}

$1 in tagName2nr {
    lineNr = 1
}

lineNr {
    if ( lineNr == 1 ) {
        for (fldNr=1; fldNr<=NF; fldNr++) {
            fldNr2tagNr[fldNr] = tagName2nr[$fldNr]
        }
    }
    else if ( lineNr == 5 ) {
        for (fldNr=1; fldNr<=NF; fldNr++) {
            tagNr = fldNr2tagNr[fldNr]
            tagNr2val[tagNr] = $fldNr
        }
    }

    if ( lineNr == 7 ) {
        tagNr = tagName2nr["Signature"]
        tagNr2val[tagNr] = tagNr2val[tagNr] " " $1

        if ( !(printedHdr++) ) {
            for (tagNr=1; tagNr<=numTags; tagNr++) {
                printf "%s%s", tagNr2name[tagNr], (tagNr<numTags ? OFS : ORS)
            }
        }
        for (tagNr=1; tagNr<=numTags; tagNr++) {
            printf "%s%s", tagNr2val[tagNr], (tagNr<numTags ? OFS : ORS)
        }
        delete tagNr2val
        lineNr = 0
    }
    else {
        lineNr++
    }
}

.

$ awk -f tst.awk file
Date,Name,Program,Signature,Style
July 5/2009,Jerry Lewis,3267-A0,DJFHJJHJHHL SJF98SDAS7,Compact Flash

Вы можете настроить «Program» на «ProgramID» при печати строки заголовка, еслиэто действительно имеет значение.

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