Created
January 2, 2014 14:05
-
-
Save tanob/8219612 to your computer and use it in GitHub Desktop.
Uso: $ ../INPUTS/parser.rb ../INPUTS/TS_ESCOLA.map < TS_ESCOLA.TXT > indicadores_por_escola.csv
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env ruby | |
input_map = IO.readlines(ARGV[0]).inject({}) do |memo, line| | |
field_name, fstart, fend = line.match(/(\S+)\s+([0-9]+)-([0-9]+)/).captures | |
range = Range.new(fstart.to_i, fend.to_i) | |
memo.merge({field_name => range}) | |
end | |
class Parser | |
attr_accessor :line | |
def initialize(input_map) | |
@input_map = input_map | |
end | |
def bool(name) | |
field(name) == '1' | |
end | |
def int(name) | |
field(name).to_i | |
end | |
def field(name) | |
raise "Field #{name} is unknown" unless @input_map[name] | |
line[@input_map[name]] | |
end | |
end | |
def as_bool(value) | |
value ? '1' : '0' | |
end | |
parser = Parser.new(input_map) | |
fields = ['PK_COD_ENTIDADE', 'ALIMENTACAO', 'BIBLIOTECA', 'INFRA_BASICA', 'INFORMATICA', 'QUADRA_ESPORTIVA'] | |
puts fields.join(',') | |
$stdin.each_line do |line| | |
output = [] | |
parser.line = line | |
in_activity = parser.int('DESC_SITUACAO_FUNCIONAMENTO') == 1 | |
situacao_ok = parser.int('DESC_SITUACAO_CENSO2011') == 0 | |
next unless in_activity && situacao_ok | |
# | |
# PK_COD_ENTIDADE 5-13 F9 | |
# | |
# Filtros (OU) | |
# ID_REG_FUND_8_ANOS 202-202 A1 | |
# ID_REG_FUND_9_ANOS 203-203 A1 | |
# ID_ESP_FUND_8_ANOS 211-211 A1 | |
# ID_ESP_FUND_9_ANOS 212-212 A1 | |
# ID_EDUCACAO_INDIGENA 227-227 A1 | |
filter = [ 'ID_REG_FUND_8_ANOS', 'ID_REG_FUND_9_ANOS', 'ID_ESP_FUND_8_ANOS', 'ID_ESP_FUND_9_ANOS', 'ID_EDUCACAO_INDIGENA', ].inject(true) { |memo, field| memo || parser.bool(field) } | |
next unless filter | |
output << parser.field('PK_COD_ENTIDADE').strip | |
# Alimentação | |
# ID_ALIMENTACAO 194-194 A1 | |
output << as_bool(parser.bool('ID_ALIMENTACAO')) | |
# Biblioteca | |
# ID_BIBLIOTECA 143-143 A1 | |
output << as_bool(parser.bool('ID_BIBLIOTECA')) | |
# Infra Basicos (E) | |
# ~ID_AGUA_INEXISTENTE 121-121 A1 | |
# ~ID_ENERGIA_INEXISTENTE 125-125 A1 | |
# ~ID_ESGOTO_INEXISTENTE 128-128 A1 | |
# ID_SANITARIO_DENTRO_PREDIO 148-148 A1 | |
# ID_SANITARIO_EI 149-149 A1 | |
# ID_SANITARIO_PNE 150-150 A1 | |
output << as_bool(!parser.bool('ID_AGUA_INEXISTENTE') && !parser.bool('ID_ENERGIA_INEXISTENTE') && !parser.bool('ID_ESGOTO_INEXISTENTE') && (parser.bool('ID_SANITARIO_DENTRO_PREDIO') || parser.bool('ID_SANITARIO_EI') || parser.bool('ID_SANITARIO_PNE'))) | |
# Informatica (E) | |
# ID_LABORATORIO_INFORMATICA 137-137 A1 | |
# ID_COMPUTADORES 170-170 A1 | |
# NUM_COMP_ALUNOS 181-185 F5 // > 0 | |
# ID_INTERNET 186-186 A1 | |
# ID_BANDA_LARGA 187-188 F2 - ? Nao entendi pq F2 e olhando os dados nao achei nenhum com valor especificado | |
# | |
# Notamos varias escolas com Lab+Comp+Internet mas contem 0 NUM_COMP_ALUNOS | |
informatica = parser.bool('ID_LABORATORIO_INFORMATICA') && parser.bool('ID_COMPUTADORES') && parser.bool('ID_INTERNET') | |
output << as_bool(informatica) | |
# | |
# Quadra esportiva (OU) | |
# ID_QUADRA_ESPORTES_COBERTA 140-140 A1 | |
# ID_QUADRA_ESPORTES_DESCOBERTA 141-141 A1 | |
output << as_bool(parser.bool('ID_QUADRA_ESPORTES_COBERTA') || parser.bool('ID_QUADRA_ESPORTES_DESCOBERTA')) | |
puts output.join(',') | |
end | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment