Skip to content

Instantly share code, notes, and snippets.

@tanob
Created January 2, 2014 14:05
Show Gist options
  • Save tanob/8219612 to your computer and use it in GitHub Desktop.
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
#!/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