正如标题所示,我有一个文件需要将每个句子提取到Excel中的单元格,每个单元格一个。
句子提取可以像查找下一个". "
一样简单并提取到单元格。问题是除了MATLAB之外,我真的不懂任何编程语言(我是一名机械工程师)。
如果它可以忽略那些令人敬畏的桌子/图片,如果不是很好,只要它在遇到桌子/图片时不会搞砸。我知道我并没有给你很多工作,但感谢任何帮助。
答案 0 :(得分:0)
你没有说出你想要的"句子单元"被打好...
简短回答:这是不可能的。
扩展答案:这很难,而且还取决于您的特定PDF文件。有些PDF文件不会将完全提供给文本提取。
您可以尝试以下命令,该命令会尝试将每个句子捕获到CSV类型表的字段中(只有一列,并且行数相当于总句子数:
pdftotext -layout -x 10 -y 20 -W 400 -H 490 the.pdf - \
| tr "\\n" " " \
| perl -pe 's#\f# #g' \
| perl -pe 's#\. #.\n#g' \
| perl -pe 's#\? #?\n#g' \
| perl -pe 's#\! #!\n#g' \
| sed 's#^#"#' \
| sed 's#$#",#' \
| tee myvalues.csv
此示例适用于我创建的sample 2-page PDF以快速测试上述命令。 PDF的屏幕截图:
以上命令适用于Linux和Mac OS X. (抱歉,没时间想出相同的Windows版本!)
要了解此命令如何(和IF)对 您的 PDF有效,请继续前进:
首次执行 第一行 作为首次尝试(摆脱最终的 \
标志这只是行继续标记。第一行将仅从PDF中提取文本并将其打印在标准输出通道上。如果这不起作用,所有其他线路也不会。 -x .. -y .. -W .. -H ..
参数通过选择左上角的矩形坐标角(x
和y
)来尝试摆脱页脚和页眉(如示例PDF中的页面编号) ,以及页面区域宽度(W
)和高度(H
),以限制该区域的文本提取。
第二次尝试执行 前两行 (在第一行保留行继续标记,在第二行删除标记)。第二行从第一行获取输出,并用空格字符替换每个换行符。因此,您将页面的所有内容都放在一行中。
在第三次尝试中执行 前三行 (在第一行和第二行中保留行继续标记,删除第三行上的标记)。第三行获取前两行的输出,并用空格字符替换每个formfeed字符。当分页发生时,这些换页字符可能出现在原始输出中,有时在句子中。 (或者,您可以将-nopgbrk
添加到原始pdftotext
命令中,以避免完全插入分页符。)因此,您将所有页面的所有内容放在一行上。
最后,执行上面给出的 所有行 。第四行用换行符替换所有出现的.
(冒号后跟空格)。第五和第六行打破由问题和感叹号结束的句子。第七行和第八行将行包装成引号,并用逗号结束每一行。最后一行将结果传递到文件myvalues.csv
这是输出的外观:
"this is a paragraph.",
"this is a sentence.",
"this is a sentence.",
"this is a sentence.",
"this is a sentence.",
"this is a sentence.",
"this is a sentence.",
"this is a sentence.",
"this is a sentence.",
"this is a sentence.",
"this is a paragraph.",
"this is a sentence.",
"this is a sentence.",
"this is a sentence.",
[....]
"this is a sentence.",
如果命令按预期工作,它将返回CSV(逗号分隔值)文本文件。这种类型的文本文件可以轻松导入Excel。