gpt4 book ai didi

r - 抓取跨越多个页面的大型 pdf 表格

转载 作者:行者123 更新时间:2023-12-03 20:04:35 25 4
gpt4 key购买 nike

我想刮 PDF tables which span across multiple pages .我尝试了很多东西,但最好的似乎是 pdftotext -layoutadvised here .问题是生成的文本文件不容易处理,因为表格布局因页面而异,因此列未对齐。还要注意以“Solsonès”开头的行中的缺失值:

                                                                        TEMPERATURA MITJANA MENSUAL ( ºC ) - 2012

COMARCA CODI i NOM EMA GEN FEB MAR ABR MAI JUN JUL AGO SET OCT N

Alt Camp VY Nulles 7,5 5,5 10,9 12,3 16,7 21,6 22,3 24,4 20,1 15,9
Alt Camp DQ Vila-rodona 7,9 5,6 11,0 12,0 16,6 21,6 22,0 24,3 19,9 15,8
Alt Empordà U1 Cabanes 8,2 6,5 11,7 12,6 17,5 22,0 23,1 24,4 20,4 16,6
Alt Empordà W1 Castelló d'Empúries 8,1 6,4 11,6 12,9 17,0 21,1 22,0 23,4 20,1 16,4

[...]
TEMPERATURA MITJANA MENSUAL ( ºC ) - 2012

COMARCA CODI i NOM EMA GEN FEB MAR ABR MAI JUN JUL AGO SET OCT

Baix Empordà DF la Bisbal d'Empordà 6,6 5,3 10,9 12,6 17,2 21,9 22,9 24,6 20,3 16
Baix Empordà UB la Tallada d'Empordà 6,1 5,2 10,7 12,3 16,6 21,3 22,2 23,8 19,7 15
Baix Empordà UC Monells 6,1 4,6 9,9 11,4 16,5 21,7 23,0 24,5 19,6 15

[...]

TEMPERATURA MITJANA MENSUAL ( ºC ) - 2012

COMARCA CODI i NOM EMA GEN FEB MAR ABR MAI JUN JUL AGO SET OCT
[...]

Solsonès CA Clariana de Cardener 4,6 3,3 10,3 10,2 16,7 22,3 d.i.
Solsonès Z8 el Port del Comte (2.316 m) -0,9 -6,3 -0,2 -2,0 5,3 10,5 10,9 13,8 7,8 4,2
Solsonès VO Lladurs 3,0 2,6 9,5 9,0 15,3 21,4 21,6 24,3 17,5 13,0
Solsonès VP Pinós 3,0 1,6 8,9 9,2 15,4 21,1 21,3 23,8 17,6 13,3
Solsonès XT Solsona d.i. 24,3 18,0 13,5
Tarragonès VQ Constantí 7,9 6,0 11,2 13,1 17,1 21,9 22,6 24,6 20,6 16,6
Tarragonès XE Tarragona - Complex Educatiu 10,2 7,8 12,3 14,6 18,3 23,0 24,2 26,2 23,0 * 18,4
Tarragonès DK Torredembarra 9,7 7,7 12,3 14,3 17,9 22,8 24,3 26,2 22,7 18,5
Terra Alta WD Batea 6,3 5,0 11,2 12,1 18,3 23,0 23,3 25,5 20,2 15,9
Terra Alta XP Gandesa 6,6 5,2 11,2 12,2 18,1 22,9 23,4 25,6 20,4 16,0

complete file for download - UTF8

所以,这个输出不是很容易解析。还有什么其他方法可用?

似乎我使用的每个工具都只能提取有关表格单元格布局的信息,但不能提取属于特定列的信息。如果单元格为空,则这一点非常明显 - 空单元格不在输出中,您只能获得非空的“单元格”及其布局。 PDF 本身是否包含此表格信息? 如果没有,搜索将提取它的工具没有意义。

付费解决方案并非没有问题 ,因为它最终可能比我花费几个工作日的时间更便宜......

我尝试过的:
  • 复制粘贴 - 导致缺失值问题(第 5 页)
  • 从 Acrobat 保存为文本(甚至比复制粘贴更糟糕的结果)
  • 在 Excel 中作为外部数据源打开 - 将无法识别表
  • https://www.pdftoexcelonline.com/ - 导致错误
  • http://www.pdftoexcel.org/以及他们对 Able2Extract 的试用 - they messed up some columns .他们在预览中正确识别了列,但在 excel 输出中他们搞砸了
  • http://www.pdftoword.com/ - 只收我的电子邮件,从不发送任何东西
  • 上使用 python scraperwiki http://schoolofdata.org/2013/06/18/get-started-with-scraping-extracting-simple-tables-from-pdf-documents/
    似乎非常复杂,尤其是对于非 Python 用户 https://scraperwiki.com/不是免费的
  • 我遇到过几个 python 库,比如 pdftables但是对于像我这样的非 Python 开发人员来说,它们并不容易使用(我什至无法运行这些东西)。有没有更简单的方法来完成任务?
  • 我正在尝试使用 tm R 中的库为 recommended here ,但是 I have encountered some problems

  • 编辑:Ian 推荐的 Cloud SDK。我注册了,但我绝对不知道从哪里开始 - 如何上传页面,识别它们等:

    enter image description here

    最佳答案

    好的,我对此进行了尝试,我认为它会有所帮助,尽管我不确定您希望最终输出是什么样的。我很高兴在这方面做更多的工作,所以如果有您需要帮助的部分,请告诉我。

    我首先下载了一个 PDF to Text application来自 CNET。

    安装后,我检查了这些设置:

    PDF to text conversion

    这里的重要部分是我们正在使用物理布局选项。

    这给了我们看起来像这样的输出:

    Taules de Dades de la Xarxa d’Estacions
    Meteorològiques Automàtiques
    2 Anuari de dades meteorològiques 2012 / Servei Meteorològic de Catalunya
    2 TEMPERATURA MITJANA MENSUAL ( ºC ) - 2012

    COMARCA CODI i NOM EMA GEN FEB MAR ABR MAI JUN JUL AGO SET OCT NOV DES ANY

    Alt Camp VY Nulles 7,5 5,5 10,9 12,3 16,7 21,6 22,3 24,4 20,1 15,9 11,0 8,5 14,8
    Alt Camp DQ Vila-rodona 7,9 5,6 11,0 12,0 16,6 21,6 22,0 24,3 19,9 15,8 11,0 8,6 14,7
    Alt Empordà U1 Cabanes 8,2 6,5 11,7 12,6 17,5 22,0 23,1 24,4 20,4 16,6 11,8 8,3 15,3
    Alt Empordà W1 Castelló d'Empúries 8,1 6,4 11,6 12,9 17,0 21,1 22,0 23,4 20,1 16,4 12,1 8,5 15,0
    Alt Empordà VZ Espolla 9,0 6,7 12,4 12,7 17,8 22,0 23,3 24,8 20,9 16,7 12,0 8,9 15,6

    [......]

    3 Anuari de dades meteorològiques 2012 / Servei Meteorològic de Catalunya
    2 TEMPERATURA MITJANA MENSUAL ( ºC ) - 2012

    COMARCA CODI i NOM EMA GEN FEB MAR ABR MAI JUN JUL AGO SET OCT NOV DES ANY

    Baix Empordà DF la Bisbal d'Empordà 6,6 5,3 10,9 12,6 17,2 21,9 22,9 24,6 20,3 16,6 11,9 7,6 14,9
    Baix Empordà UB la Tallada d'Empordà 6,1 5,2 10,7 12,3 16,6 21,3 22,2 23,8 19,7 15,8 11,7 7,6 14,4
    Baix Empordà UC Monells 6,1 4,6 9,9 11,4 16,5 21,7 23,0 24,5 19,6 15,7 11,7 7,2 14,3
    Baix Empordà UD Serra de Daró 6,3 5,3 10,6 12,3 16,8 21,6 22,7 24,3 20,3 16,6 12,2 7,7 14,8

    [......]

    4 Anuari de dades meteorològiques 2012 / Servei Meteorològic de Catalunya
    2 TEMPERATURA MITJANA MENSUAL ( ºC ) - 2012

    COMARCA CODI i NOM EMA GEN FEB MAR ABR MAI JUN JUL AGO SET OCT NOV DES ANY

    Maresme UQ Dosrius - PN Montnegre Corredor 7,2 4,6 10,8 10,7 15,8 20,4 20,8 23,4 18,6 15,1 10,7 7,8 13,9
    Maresme WT Malgrat de Mar 7,4 5,4 11,0 13,0 16,7 21,5 22,8 24,6 20,9 17,2 12,9 8,8 15,2
    Maresme DD Vilassar de Mar 10,1 7,5 12,6 13,9 17,9 22,4 23,7 25,7 22,1 18,4 13,8 10,8 16,6
    Montsià US Alcanar 10,0 7,6 11,8 14,2 17,9 22,7 24,0 25,8 22,0 18,2 13,7 10,7 16,6
    Montsià UU Amposta 9,6 7,5 12,1 14,3 18,3 22,8 23,5 25,3 21,6 18,0 13,1 10,8 16,4

    [......]

    您可以看到列排列得更好,但我们也有标题和页码。还有 COMARCAi NOM EMA列的长度各不相同。我们希望将其标准化为固定宽度的列。

    我写了一个 Perl 程序来对它进行规范化,它还合并了具有相同标题的表格,并且只在顶部打印标题。它创建一个输出文件夹,其中包含所有以标题为文件名的文件。

    这是代码:
    #!/bin/perl

    use strict;
    use warnings;
    use open qw(:std :utf8);
    use utf8;

    my $comarca;
    my $nom;
    my $print_headers;
    my $title = "";
    my $fh;

    while(<>) {

    if ( !/Xarxa d’Estacions/
    and !/Meteorològiques Automàtiques/
    and !/Servei/
    and !/^\s*\d+\s*$/
    and !/^\s*$/ ) {

    chomp($_);


    if ( /^\s*2/ ) { #title
    s/^\s*2\s*//;
    if ( $title ne $_ ) {
    $title = $_;
    $print_headers = 1;
    }

    } elsif ( /COMARCA/ ) { #column headers

    my ($first_col, $second_col, @the_rest) = split(/(CODI +i NOM EMA *)/, $_);


    $comarca = length $first_col;
    $nom = length $second_col;

    if ( $print_headers ) {
    my $str = sprintf "%-50s %-50s %s\n", $first_col, $second_col, join("", @the_rest);
    write_string($str);
    $print_headers = 0;
    }

    } else { #data

    my ($one, $two, $three) = unpack("A${comarca}A${nom}A*", $_);
    my $str = sprintf "%-50s %-50s $three\n", $one, $two;
    write_string($str);
    }

    }
    }

    sub write_string {

    my $string = shift;
    my $file_name = $title;
    $file_name =~ s/[\/\\]//g;

    open ($fh, '>>', ".\/output_folder\/${file_name}.txt") or die "Couldn't open: $!";
    print $fh $string;
    close ($fh);
    }

    输出中仍有一些不完善之处(运行此程序时您会看到这些),但我想获得一些关于哪种输出最适合您的反馈。我们当然可以做更多的事情来改进代码!输出目录树如下所示:
    Matt@MattPC ~/perl/pdftotext
    $ find .
    .
    ./convert.pl
    ./EMAtaules2012.txt
    ./output.txt
    ./output_folder
    ./output_folder/AMPLITUD TÈRMICA MITJANA MENSUAL ( ºC ) - 2012?.txt
    ./output_folder/AMPLITUD TÈRMICA MÀXIMA MENSUAL ( ºC ) - 2012?.txt
    ./output_folder/DIRECCIÓ DOMINANT DEL VENT - 2012?.txt
    ./output_folder/GRUIX MÀXIM MENSUAL DE NEU AL TERRA ( cm ) - 2012?.txt
    ./output_folder/HUMITAT RELATIVA MITJANA MENSUAL ( % ) - 2012?.txt
    ./output_folder/MITJANA MENSUAL DE LA HUMITAT RELATIVA MÀXIMA DIÀRIA ( % ) - 2012?.txt
    ./output_folder/MITJANA MENSUAL DE LA HUMITAT RELATIVA MÍNIMA DIÀRIA ( % ) - 2012?.txt
    [......]

    文件可能如下所示:
    COMARCA                                            CODI i NOM EMA                                     GEN    FEB    MAR         ABR       MAI      JUN      JUL          AGO        SET        OCT        NOV         DES         ANY
    Alt Camp VY Nulles 7,5 5,5 10,9 12,3 16,7 21,6 22,3 24,4 20,1 15,9 11,0 8,5 14,8
    Alt Camp DQ Vila-rodona 7,9 5,6 11,0 12,0 16,6 21,6 22,0 24,3 19,9 15,8 11,0 8,6 14,7
    Alt Empordà U1 Cabanes 8,2 6,5 11,7 12,6 17,5 22,0 23,1 24,4 20,4 16,6 11,8 8,3 15,3
    Alt Empordà W1 Castelló d'Empúries 8,1 6,4 11,6 12,9 17,0 21,1 22,0 23,4 20,1 16,4 12,1 8,5 15,0
    Alt Empordà VZ Espolla 9,0 6,7 12,4 12,7 17,8 22,0 23,3 24,8 20,9 16,7 12,0 8,9 15,6
    Alt Empordà D6 Portbou 9,6 5,5 12,7 12,5 17,4 21,5 22,9 24,4 19,8 17,0 12,3 10,1 15,5
    [......]

    标题仅在顶部,所有列都排成一行。这是 TEMPERATURA MITJANA MENSUAL ( ºC ) - 2012 .

    我一直在考虑将更多的输出上传到文件托管站点,但我不知道哪个是好的,建议?

    希望这可以帮助你托马斯!

    编辑:AMPLITUD TÈRMICA MÀXIMA MENSUAL (ºC) - 2012 中缺失条目的示例:
    Solsonès                                           VP   Pinós                          1              3,1   26   16,9   13   16,7   15   16,6   17   19,2   11   19,6   24   20,4    17      19,1   01   17,5   16   16,5   06   13,1   08   13,9   24   20,4    17/07
    Solsonès XT Solsona 22,2 25 22,2 09 20,1 16 18,6 06 15,3 07 18,2 23 22,2 09/08
    Tarragonès VQ Constantí 1 6,4 19 21,9 23 19,7 11 12,9 07 17,4 23 17,2 21 15,1 18 14,2 18 18,0 15 15,1 02 14,9 07 16,0 10 21,9 23/02

    更新

    更新了处理输入文件的脚本:
    #!/bin/perl

    use strict;
    use warnings;
    use open qw(:std :utf8);
    use utf8;
    use charnames ':full';

    my @column_lengths;
    my $print_headers;
    my $title = "";
    my $fh;

    while(<>) {

    if ( !/Xarxa d’Estacions/
    and !/Meteorològiques Automàtiques/
    and !/Servei/
    and !/^\s*\d+\s*$/
    and !/^\s*$/ ) {

    s/[\r\n]+//g;
    s/ +\d+$//;
    if ( /^\s*2/ ) { #title
    s/^\s*2\s*//;
    if ( $title ne $_ ) {
    $title = $_;
    $print_headers = 1;
    }

    } elsif ( /COMARCA/ ) { #column headers

    my $comarca = (split(/(COMARCA *)/, $_))[1];
    my $codi = (split(/(CODI *)/, $_))[1];
    my $inomema = (split(/(i NOM EMA *) /, $_))[1];

    my $the_rest = (split(/(i NOM EMA *) /, $_))[2];

    my @rest = split(/( \w+ *)/, $the_rest);

    undef @column_lengths;

    push @column_lengths, length $comarca;
    push @column_lengths, length $codi;
    push @column_lengths, length $inomema;

    for (@rest) {
    if ( $_ ) {
    push @column_lengths, length $_;
    }
    }

    $column_lengths[-1] = "*";

    if ( $print_headers ) {
    $print_headers = 0;
    write_string(join(";", unpack( "A" . join("A", @column_lengths), $_)) . "\n");
    }

    } else { #data

    write_string(join(";", unpack( "A" . join("A", @column_lengths), $_)) . "\n");

    }

    }
    }

    sub write_string {

    my $string = shift;
    my $file_name = $title;
    $file_name =~ s/[º]//g;
    $file_name =~ s/[^\w ]//g;
    $file_name =~ s/ +/ /g;
    $file_name =~ s/È/E/g;
    $file_name =~ s/À/A/g;
    $file_name =~ s/Ó/O/g;
    $file_name =~ s/Í/I/g;
    $file_name =~ s/Ç/C/g;

    open ($fh, '>>', ".\/output_folder\/${file_name}.txt") or die "Couldn't open: $!";
    print $fh $string;
    close ($fh);
    }

    这个将线条与 d.i. 结合起来。在下一行。
    #!/bin/perl -i

    use strict;
    use warnings;

    my $last = <>;

    while(<>) {

    my @current_array = split(";", $_);

    if ( /^;+[ \t]+.d\.i\./ ) {

    my @last_array = split(";", $last);
    my @combined_array;

    #print "matches\n";

    for my $element (@current_array) {

    if ( $element =~ /d\.i\./ ) {
    push @combined_array, $element;
    shift @last_array;
    } else {
    push @combined_array, $last_array[0];
    shift @last_array;
    }

    }
    undef @current_array;
    @current_array = @combined_array;
    }
    $last = join ";", @current_array;
    print $last;

    }

    输出为带有分号分隔符的 csv 格式。

    关于r - 抓取跨越多个页面的大型 pdf 表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18078303/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com