簡體   English   中英

從pdf解析數據並使用GREP / awk / sed在CSV中格式化

[英]Parsing data from pdf and formatting it in csv using GREP/awk/sed

我有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整體移至另一個“已處理”目錄,僅此而已。

就像我說的,我有點新手,所以我什至不確定這是否可行? - 謝謝

不幸的是,腳本需要執行的大多數操作(即避免錯誤匹配)取決於您剛剛為其提供“空白”的文本以及編寫時的“空白/制表符”的含義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”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM