我使用Linux命令pdftotext -layout *.pdf
从一些pdf文件中提取文本,用于数据挖掘。生成的文本文件都位于一个文件夹中,但在使用之前需要进行一些预处理。
问题
问题1:我试图访问的每个文件中每行的第一个值是条形码,它可以是13位GTIN代码,也可以是5位PLU代码。这里的问题是,GTIN代码是用一个空格字符来描述的,这很难用脚本来替换,因为每一行也包含一个描述字段,自然地,它也包含单词之间的单个空格。在这里,我需要用相同的13个数字加两个空格(至少(替换一组13个数字和一个空格,这样预处理的后期可以用制表符替换所有多个空格。
问题2:预处理过程中我面临的另一个问题是换行符。数据行之间有许多空行。有些是数据行之间的单空行,有些是两行或多行。我希望数据行之间没有空行,但每一行都将由换行符描绘。
问题3:最终生成的每个文件都需要是制表符分隔的值文件,以便导入到电子表格中。数据行中的一些描述可能包含逗号,所以我使用的是TSV而不是CSV文件。我只需要在行中的每个值之间有一个选项卡。
示例行
(为了清楚起见,我在这里用•替换了空格,用¶字符替换了换行符。(
9415077026340•Pams•Sour•Cream•&•Chives•Rice•Crackers•100g•••$1.19¶
¶
¶
9415077026296•Pams•BBQ•Chicken•Rice•Crackers•100g•••$1.19¶
¶
61424••••••••••••Yoghurt•Raisins•kg•••$23.90/kg¶
¶
9415077036349•Pams•Sliced•Peaches•In•Juice•410g•••$1.29¶
预期结果
(我还将选项卡替换为⇥为了清晰起见,此处为字符。(
9415077026340⇥Pams•Sour•Cream•&•Chives•Rice•Crackers•100g⇥$1.19¶
9415077026296⇥Pams•BBQ•Chicken•Rice•Crackers•100g⇥$1.19¶
61424⇥Yoghurt•Raisins•kg⇥$23.90/kg¶
9415077036349⇥Pams•Sliced•Peaches•In•Juice•410g⇥$1.29¶
我试过什么
我慢慢地了解了更多关于各种Linux脚本实用程序的信息,如sed
/grep
/awk
/tr
等。StackOverflow中发布了许多解决方案,它们解决了我面临的一些问题,但当我试图以我需要的方式将它们串在一起时,它们是不同的,令人困惑。有些是";接近但不完全";解决方案,例如在每个数据行之间用一条换行符替换所有双换行符。我不需要他们之间的额外一排。我一直在寻找并尝试几种不同的选择,这些选择都接近我的需求。如果有人能提出一个使用单个实用程序(如sed
(同时解决所有问题的解决方案,那将是很有帮助的。
使用perl脚本,可以用制表符替换空格,并删除文本文件中的空行。
例如:
#!/usr/bin/perl
use strict;
use utf8;
use warnings;
# Save original text as backup
$^I = ".bak";
while ( <> )
{
# If the line starts with digits...
if ( /^d+/ )
{
# Replace the space or spaces after the numbers with a tab.
s/^(d+)s+(w)/$1t$2/;
# Replace three spaces before the price at the end of the line with a tab.
s/s{3}(.+)$/t$1/;
# Save the line.
print;
}
}
exit;