TMS*_*TMS 15 perl ms-access r pdf-scraping
我试图刮掉跨越多个页面的PDF表格.我试过很多东西,但最好的似乎是 pdftotext -layout为这里建议.问题是生成的文本文件不易使用,因为表格布局在页面之间不同,因此列不对齐.另请注意以"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
Run Code Online (Sandbox Code Playgroud)
所以,这个输出不是很容易解析.还有哪些其他方法?
似乎每一次的工具,我用的是只能提取有关信息布局表格单元格,但不提取属于特定列的信息.如果单元格为空,则非常明显 - 空单元格不在输出中,您只能获得具有布局的非空"单元格".PDF本身是否包含此表格信息?如果没有,搜索将提取它的工具没有意义.
付费解决方案并不是不可能的,因为它可能最终比我投入的几个工作日更便宜......
我尝试过的:
我遇到过几个像pdftables这样的python库,但是对于像我这样的非python开发人员来说它们并不容易使用(我甚至无法运行这些东西).有没有更简单的方法来完成任务?
编辑:Ian推荐的Cloud SDK.我注册但我绝对不知道从哪里开始 - 如何上传页面,识别它们等:

好吧,我对此采取了一些措施,我认为这会有所帮助,虽然我不确定你想要的最终输出是什么样的.我很乐意在这方面做更多的工作,所以请告诉我你是否需要帮助.
我开始从CNET 下载PDF到Text应用程序.
安装后,我检查了这些设置:

这里的重要部分是我们正在使用物理布局选项.
这给了我们看起来像这样的输出:
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
[......]
Run Code Online (Sandbox Code Playgroud)
您可以看到列的排列更好,但我们也有标题和页码.此外COMARCA,i 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);
}
Run Code Online (Sandbox Code Playgroud)
输出中仍然存在一些不完善之处(当你运行它时你会看到这些),但我想得到一些关于哪种输出最适合你的反馈.我们肯定可以做更多改进代码!输出目录树如下所示:
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
[......]
Run Code Online (Sandbox Code Playgroud)
文件可能如下所示:
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
[......]
Run Code Online (Sandbox Code Playgroud)
标题只在顶部,所有列都排列在一起.这个是TEMPERATURA MITJANA MENSUAL ( ºC ) - 2012?.
我一直在考虑将更多的输出上传到文件托管网站,但我不知道哪个是好的,建议?
希望这可以帮助你Tomas!
编辑:AMPLITUDTÈRMICAMÀXIMAMENSUAL(º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
Run Code Online (Sandbox Code Playgroud)
更新了用于处理输入文件的脚本:
#!/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);
}
Run Code Online (Sandbox Code Playgroud)
这一行将线条与下一行的di结合起来.
#!/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;
}
Run Code Online (Sandbox Code Playgroud)
输出采用带分号分隔符的csv格式.
这是一个R解决方案,但它并非没有缺陷.
# Read the lines of your file into R
x <- readLines("EMAtaules2012.txt")
# Make sure it shows up as UTF-8 to get proper accents and so on
Encoding(x) <- "UTF-8"
# Identify the lines where the data starts
Start <- grep("COMARCA", x)
# Grab the names of each table
ListNames <- gsub("\\s+", " ", x[Start-2])
# Figure out the number of rows of data per page
Runs <- rle(diff(cumsum(x != "")))
Nrows <- Runs$lengths[Runs$lengths > 4]+1
# Make our life easier by making this column name
# a single string
x <- gsub("i NOM EMA", "i_NOM_EMA", x)
# Since these are fixed width files, we need to figure
# out the widths of each column. This is the sum of
# the number of characters in the header row plus
# the number of spaces between each column name
Spaces <- gregexpr(x[Start], pattern="\\s+")
Spaces <- lapply(Spaces, function(x) c(attr(x, "match.length"), 0))
Chars <- lapply(strsplit(x[Start], "\\s+"), nchar)
Widths <- lapply(seq_along(Spaces),
function(x) rowSums(cbind(Spaces[[x]],
Chars[[x]])))
Run Code Online (Sandbox Code Playgroud)
read.fwf用于获取数据# Now, you can use `read.fwf` to read your data files in
temp <- lapply(seq_along(Start), function(fwf) {
A <- read.fwf(textConnection(x),
widths = c(Widths[[fwf]]),
header = FALSE,
skip = Start[fwf]+1,
n = Nrows[fwf]-2,
blank.lines.skip = TRUE,
strip.white = TRUE,
stringsAsFactors = FALSE)
# Add in the column names
names(A) <- scan(what = "character",
file = textConnection(x[Start[fwf]]),
quiet = TRUE)
A
})
# Assign the table names
names(temp) <- ListNames
# Some more cleanup. The original tables span multiple pages
# in the PDF, but we can `rbind` them together in R
Tables <- unique(ListNames)
final <- lapply(seq_along(Tables), function(final) {
A <- do.call(rbind, temp[names(temp) %in% Tables[final]])
rownames(A) <- NULL
A
})
# Add the names back in
names(final) <- Tables
Run Code Online (Sandbox Code Playgroud)
# View the first few rows and columns of the first three tables
lapply(final[1:3], function(y) head(y[1:5], 3))
# $` TEMPERATURA MITJANA MENSUAL ( ºC ) - 2012`
# COMARCA CODI i_NOM_EMA GEN FEB
# 1 Alt Camp DQ Vila-rodona 7,9 5,6
# 2 Alt Empordà U1 Cabanes 8,2 6,5
# 3 Alt Empordà W1 Castelló d'Empúries 8,1 6,4
#
# $` TEMPERATURA MÀXIMA MITJANA MENSUAL ( ºC ) - 2012`
# COMARCA CODI i_NOM_EMA GEN FEB
# 1 Alt Camp DQ Vila-rodona 13,1 11,7
# 2 Alt Empordà U1 Cabanes 15,1 12,4
# 3 Alt Empordà W1 Castelló d'Empúries 14,4 11,7
#
# $` TEMPERATURA MÍNIMA MITJANA MENSUAL ( ºC ) - 2012`
# COMARCA CODI i_NOM_EMA GEN FEB
# 1 Alt Camp DQ Vila-rodona 3,8 0,5
# 2 Alt Empordà U1 Cabanes 2,4 0,9
# 3 Alt Empordà W1 Castelló d'Empúries 2,1 0,5
# Some tables, like those on page 76 (for the table "DIRECCIÓ DOMINANT DEL VENT"), had more columns than others.
# Did our script take care of that?
names(final$` DIRECCIÓ DOMINANT DEL VENT`)
# [1] "COMARCA" "CODI" "i_NOM_EMA" "vent" "GEN" "FEB"
# [7] "MAR" "ABR" "MAI" "JUN" "JUL" "AGO"
# [13] "SET" "OCT" "NOV" "DES" "ANY"
Run Code Online (Sandbox Code Playgroud)
它有点奏效.但是,您的输入文件并不完美,这意味着仍然会有很多清理工作.例如,PDF中的某些列似乎有多个值.不知道你将如何对这些进行任何分析.
希望上面代码中的注释可以帮助您开始找出如何以更好的方式抓取数据.
在上面的"第1部分"之后继续,这是一个依赖于(喘气)Excel 的解决方案.基本思想是,如果将文本导入为"固定宽度",Excel实际上可以很好地检测列断点的位置.
因此,我们使用R将文本分解为单独的页面,每页一个文件,只有数据(不是列名或行名,在所有数据集中大致相同).
有了这个,这是最后一个R步骤:
# Output just the data
temp <- lapply(seq_along(Widths), function(y) {
DEL <- sum(Widths[[y]][1:3])-2
A <- substring(x[(Start[y]+1):(sum(Start[y], Nrows[y]))], DEL)
writeLines(A, paste("temp_", y, ".txt", collapse = ""))
A
})
Run Code Online (Sandbox Code Playgroud)
让我们打开文件"temp_9.txt",这是一个缺少列的文件:

^^确保选择"固定宽度" - 默认情况下应该是该文件没有分隔符.

^^ Excel显示预览列的位置.

^^我已经突出显示了"问题行",以便您了解它是如何运作的.
在过去,我已经使用pdftohtml可以用来生成XML,描述在这里.列通常分离得很好,因此您可以使用定位来提取列.
我写了很多pdftables,为不透明道歉!对于您显示的文档的某些页面,它可以正常工作,例如第2页给出了此回复底部的输出.例如,对于其他页面,它会在第33页上失效.这里的问题是在一个列标题下有两个数字,它们被pdftables粘在一起.在任何一种情况下,"COMARCA,CODI i,NOM EMA"列都不会分开.你可以在GitHub上提交pdftables的问题,我现在还没有积极地处理它.它可以通过pip install获得.
如果你想走商业路线,那么Abbyy FineReader非常好,他们会制作一个云SDK,可以免费提供30个左右的页面.他们有多种语言的示例代码,但他们的支持并不是很好.
14 columns, 39 rows
0 1 2 3 4 5 6 7 8 9 10 11 12 13
-----------------------------------------------------------------------------------------------------
0 | COMARCACODI i NOM EMA| GEN| FEB| MAR| ABR| MAI| JUN| JUL| AGO| SET| OCT| NOV| DES| ANY|
1 | VYNullesAlt Camp| 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|
2 | DQVila-rodonaAlt Camp| 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|
3 | Alt Empordà U1Cabanes| 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|
4 | Alt Empordà W1Castelló 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|
5 | Alt Empordà VZEspolla| 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|
6 | D6PortbouAlt Empordà | 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|
7 | D4RosesAlt Empordà | 9,3| 7,2|13,0|13,6|18,2|22,6|23,9|25,7|21,3|17,5|13,2| 9,9|16,3|
8 | Alt Empordà U2Sant Pere Pescador| 7,8| 6,3|11,5|12,9|16,8|21,2|22,2|23,6|20,2|16,5|12,3| 8,5|15,0|
9 | Alt Empordà W2Torroella de Fluvià | 7,4| 6,0|11,2|12,6|16,4|21,2|22,3|23,7|19,9|16,1|11,7| 8,0|14,7|
10 | Alt Empordà W3Ventalló| 7,3| 6,2|11,4|12,8|16,9|21,8|22,8|24,3|20,4|16,5|12,0| 8,1|15,1|
11 | Alt PenedèsWPCanaletes| 7,0| 5,2|11,3|11,9|16,7|21,5|22,0|24,2|19,7|15,6|10,7| 8,1|14,5|
12 | Alt PenedèsDIFont-rubÃ| 8,1| 6,2|12,0|11,9|16,9|21,8|22,0|24,4|20,0|15,9|11,4| 8,9|15,0|
13 | Alt PenedèsW4la Granada| 7,0| 5,5|11,2|12,6|17,2|21,9|22,4|24,3|20,0|16,0|11,1| 8,3|14,8|
14 | Alt PenedèsU3Sant Martà Sarroca| 6,4| 5,1|10,9|12,4|17,0|21,8|22,3|24,3|19,9|15,7|10,8| 8,0|14,6|
15 | Alt PenedèsWYSant Sadurnà d'Anoia| 6,4| 5,1|11,0|12,8|17,6|22,6|23,2|25,0|20,5|16,2|10,9| 7,8|15,0|
16 | CDla Seu d'UrgellAlt Urgell| 3,6| 2,5| 8,5| 8,4|14,6|20,3|21,0|23,4|16,9|12,2| 7,0| 3,2|11,8|
17 | W5OlianaAlt Urgell| 2,0| 2,7| 9,8|10,2|16,8|23,0|22,9|25,6|19,1|13,9| 8,6| 3,1|13,2|
18 | Alt UrgellCJOrganyà | 2,6| 3,5| 9,8| 9,9|16,1|22,0|22,6|25,3|18,8|13,5| 8,2| 2,9|13,0|
19 | Alta RibagorçaZ2Boà (2.535 m)|-2,4|-7,5|-1,3|-3,4| 3,8| 8,6| 9,4|12,0| 6,3| 2,7|-1,1|-3,2| 2,0|
20 | Alta RibagorçaCTel Pont de Suert| 0,5| 1,6| 6,9| 7,9|14,1|18,0|19,1|20,4|15,7|10,7| 6,1| 1,3|10,2|
21 | CEels Hostalets de PierolaAnoia| 7,3| 5,5|11,7|12,1|17,4|22,4|22,9|25,2|20,3|16,2|11,1| 8,3|15,1|
22 | XBla LlacunaAnoia| 5,4| 3,3| 9,3|10,3|15,6|20,8|20,9|23,3|18,0|14,1| 9,1| 6,9|13,1|
23 | AnoiaXAla Panadella| 3,6| 1,7| 9,2| 8,7|14,9|20,5|20,4|23,2|17,2|13,3| 7,9| 5,1|12,2|
24 | H1Ã’denaAnoia| 5,1| 3,3| 9,4|11,5|16,3|21,7|22,5|24,6|19,4|15,2| 9,3| 6,0|13,7|
25 | WWArtésBages| 3,5| 2,8| 9,2|11,2|16,6|22,4|23,2|25,1|19,3|15,0| 9,1| 4,3|13,5|
26 | U4Castellnou de BagesBages| 4,8| 3,8|10,5|10,9|16,3|22,0|22,5|25,0|19,3|15,0| 9,6| 5,9|13,9|
27 | R1el Pont de VilomaraBages| 3,8| 3,1| 9,9|12,3|17,4|22,9|23,5|25,4|20,0|15,7| 9,7| 5,0|14,1|
28 | BagesWNMontserrat - Sant Dimes| 6,2| 3,3| 9,7| 8,6|14,8|19,5|19,5|22,4|16,9|13,5| 9,0| 7,1|12,6|
29 | CLSant Salvador de GuardiolaBages| 3,3| 2,8| 9,1|11,5|16,4|22,0|22,4|24,6|19,2|14,9| 9,1| 4,8|13,4|
30 | U5Prades - los HortalsBaix Camp| 2,8| 0,0| 6,4| 7,4|13,0|18,4|18,0|21,3|15,0|11,3| 6,5| 4,1|10,4|
31 | W6RiudomsBaix Camp| 9,7| 7,1|12,0|13,4|17,6|22,4|23,1|25,2|21,2|17,1|12,3|10,1|16,0|
32 | U6Vinyols i els ArcsBaix Camp|10,2| 7,6|12,0|13,8|17,6|22,5|24,0|25,9|22,3|18,2|13,2|11,1|16,6|
33 | Baix EbreU7Aldover|10,0| 8,5|13,2|14,8|19,7|24,6|25,2|27,1|22,7|18,3|12,9|11,1|17,4|
34 | DBel PerellóBaix Ebre| 8,7| 7,0|12,0|13,3|17,9|22,6|23,3|25,3|21,4|17,2|11,9|10,3|15,9|
35 | U9l'AldeaBaix Ebre| 9,9| 8,1|12,5|14,3|18,5|23,3|24,1|26,0|22,1|17,9|13,1|10,7|16,8|
36 | UAl'Ametlla de MarBaix Ebre| 9,6| 7,8|12,3|13,8|18,0|22,9|23,9|25,8|22,0|17,6|12,5|10,6|16,4|
37 | Baix EbreX5PN dels Ports| 3,4|-0,2| 6,5| 6,8|13,4|18,7|17,8|21,2|15,2|11,3| 6,1| 4,9|10,5|
38 | Baix Empordà DOCastell d'Aro| 6,7| 5,1|10,6|12,0|16,2|20,9|21,8|23,8|20,1|16,3|12,2| 8,1|14,5|
-----------------------------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
unicode问题归结于我的开发环境(Spyder).