[英]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.