从pdf解析数据,然后使用GREP / awk / sed

时间:2019-02-21 16:51:07

标签: bash csv awk sed grep

我有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 :(得分:0)

不幸的是,脚本需要执行的大多数操作(即避免错误匹配)取决于您刚刚写出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

在打印标题行时,可以将“程序”调整为“程序ID”(如果确实重要)。