Prefixos de táxi de Porto Alegre/RS
18 de Outubro de 2016, 19:14 - sem comentários aindaFoi solicitado à EPTC, por meio do e-mail eptc@eptc.prefpoa.com.br, uma lista com os números dos prefixos lotados em cada um dos pontos fixos de táxis da cidade de Porto Alegre/RS. Em resposta ao e-mail, a EPTC forneceu um arquivo no formato PDF contendo duas colunas. A primeira delas, contem o nome do ponto fixo, a segunda, informa o prefixo do táxi lotado no ponto.
Solicitei à EPTC um arquivo num formato livre, estruturado e legível por máquina. Curiosamente, e em desconformidade com a lei de acesso a informação, respondeu que o formato disponível é em pdf. Diante disso, vou explicar como manipulei esse arquivo em PDF para deixar estruturado da maneira mais conveniente para mim.
Quero um arquivo em formato texto onde cada linha contem informações sobre um ponto fixo da seguinte forma:
nome-do-ponto:quantidade-de-prefixos-no-ponto:prefixo1;prefixo2;prefixo3
Onde o delimitador é :
, o primeiro campo é o nome do ponto fixo, o segundo é a quantidade de prefixos no ponto e o terceiro campo são os prefixos lotados no ponto separados pelo delimitador ;
. Reparem que a quantidade de prefixos em cada ponto não consta no arquivo original, e será obtida contando, com o awk
, os prefixos em cada ponto.
O primeiro passo é converter o arquivo do formato PDF para txt. Utilizei a ferramenta pdftotext
disponível no pacote poppler, em um sistema baseado em Arch (uso Parabola GNU Linux-libre) ou no pacote poppler-utils, em um sistema baseado em Debian:
pdftotext PrefixosPorPontos.pdf PrefixosPorPontos.pdf.txt
O resultado é um arquivo com as colunas do arquivo original intercaladas, ora os nomes dos pontos, ora os prefixos. Por isso usamos o sed
para separa-las.
Como os prefixos são números de 4 dígitos usamos a expressão regular ^[0-9]\{4\}$
para selecionar as linhas que começam e terminam com numeros de 4 dígitos e o >
para grava-las no arquivo PrefixosPorPontos.pdf.txt.prefixos
:
sed '/^[0-9]\{4\}$/!d;/^$/d' < PrefixosPorPontos.pdf.txt > PrefixosPorPontos.pdf.txt.prefixos
Como curiosidade, podemos saber quantos prefixos existem em Porto Alegre/RS, usando o wc -l
:
wc -l < PrefixosPorPontos.pdf.txt.prefixos
São 2685 táxis lotados em pontos fixos.
Para gerar um arquivo com os nomes dos pontos fixos selecionamos as linhas que NÃO começam e terminam com números de 4 dígitos e removemos as linhas em branco e que começam e terminam com as strings "Prefixo", "Ponto" e "LISTAGEM DE PONTOS FIXOS E PREFIXOS DE TÁXI". Salvamos o resultado no arquivo PrefixosPorPontos.pdf.txt.pontos
:
sed '/^[0-9]\{4\}$/d;/^$/d;/^Ponto$/d;/^Prefixo$/d;/^LISTAGEM DE PONTOS FIXOS E PREFIXOS DE TÁXI$/d' < PrefixosPorPontos.pdf.txt > PrefixosPorPontos.pdf.txt.pontos
Como curiosidade, podemos saber quantos pontos fixos de táxi existem em Porto Alegre/RS, usando o wc -l
combinado com o uniq
:
uniq < PrefixosPorPontos.pdf.txt.pontos | wc -l
São 156 pontos fixos.
Com esses dois arquivos usamos o paste
para gerar um arquivo de duas colunas delimitadas por :
:
paste -d':' PrefixosPorPontos.pdf.txt.pontos PrefixosPorPontos.pdf.txt.prefixos | sort > PrefixosPorPontos.txt
Reparem que foi usado o sort
para ordenar o arquivo PrefixosPorPontos.txt
, que possui duas colunas, onde cada linha é da seguinte forma:
nome-do-ponto:prefixo
Assim, calculamos, usando o awk
, quantos prefixos possuem cada ponto:
awk -F":" '{ a[$1]++; } END { for (i in a) print i, a[i]; }' OFS=: PrefixosPorPontos.txt | sort > PrefixosPorPontos.txt.quantidade
O arquivo PrefixosPorPontos.txt.quantidade
possui duas colunas, separadas pelo delimitador :
, onde cada linha é da seguinte forma:
nome-do-ponto:quantidade-de-prefixos-no-ponto
Podemos confirmar se o camando anterior contou corretamente, somando todos os valores da segunda coluna do arquivo PrefixosPorPontos.txt.quantidade
, usando:
awk -F":" '{ x+=$2 } END { print x }' PrefixosPorPontos.txt.quantidade
ou, usando
cut -d':' -f2 PrefixosPorPontos.txt.quantidade | paste -sd'+' - | bc
O que resulta em 2685.
Agora concatenamos os prefixos de táxi do arquivo PrefixosPorPontos.txt
:
awk -F":" '{ a[$1]=a[$1]?a[$1]";"$2:$2; } END { for (i in a) print i, a[i]; }' OFS=: PrefixosPorPontos.txt | sort > PrefixosPorPontos.txt.concatenado
Obtendo o arquivo PrefixosPorPontos.txt.concatenado
onde cada linha terá a seguinte estrutura:
nome-do-ponto:prefixo1;prefixo2;prefixo3
Agora usamos o cut
para gerarmos uma lista dos prefixos de táxi concatenados:
cut -d":" -f2 PrefixosPorPontos.txt.concatenado > PrefixosPorPontos.txt.concatenado.sem.ponto
Por fim, usamos novamente o paste
para gerar um arquivo texto PrefixosPorPontos.txt.quantidade.concatenado
estruturado da forma pretendida:
paste -d":" PrefixosPorPontos.txt.quantidade PrefixosPorPontos.txt.concatenado.sem.ponto > PrefixosPorPontos.txt.quantidade.concatenado
Então, temos um arquivo texto com três colunas, separadas por :
, onde a primeira contem o nome do ponto fixo de táxis, a segunda tem a quantidade de táxis lotados no ponto, e a terceira, os prefixos dos táxis lotados no ponto separados por ;
.
O próximo passo é adicionar a quantidade e os prefixos lotados em cada ponto fixo de táxis da cidade de Porto Alegre/RS usando:
capacity=*
taxi:prefix=*
taxi:colour=red or white
description:payment=A tarifa é calculada assim: tarifa = 5,18 + (2,59 na bandeira I ou 3,36 na bandeira II) x distancia percorrida (km) + 18,31 x tempo parado (h).