All pastes #424606 Raw Edit

Miscellany

public text v1 · immutable
·published 2007-04-04 22:20 UTC
rendered paste body
#-*- coding: latin1 -*-
from string import join
from math import ceil

class DataLoad(object):

  PlanilhaPath = 'dump_inicial.csv'
  CategoriasPath = 'categorias.csv'
  DumpPath = 'dump.sql'
  TableLocacao = ('fk_categoria','proprietario','responsavel','nascimento','cpf','rg','profissao','locacao','endereco','bairro','cidade','estado','cep','ddd','telefone','ddd_celular','celular','ddd_comercial','telefone_c','ddd','fax','email','observacoes','valores','som','animais','pesquisa','posicao','fotografo','fotos_data','banco_nome','banco_cpf','banco_banco', 'banco_agencia', 'banco_conta')
  DbName = 'primeiraproducao'
  MaxInserts = 50

  def __init__(self):
    print 'Processando...'
    self.DictCategorias = {}
    
    Data = {}
    Data['DbName'] = self.DbName
    print 'Dicionario Estrutural carregado.'

    Data['Categorias'] = self.Load('categorias', self.CategoriasPath)
    print 'Categorias carregadas.'

    DataMatriz = self.Load('planilha', self.PlanilhaPath)
    print 'Planilha Carregada.'

    Template = SqlTemplate(int(ceil(self.NumReg/self.MaxInserts)))
    print 'Template carregado.'
    Template = Template.str % Data
    a = file('teste.txt', 'w')
    a.writelines(DataMatriz)
    a.close()
    #print len(DataMatriz)
    Template = Template % DataMatriz
    try:
      File = open(self.DumpPath, 'wb')
      File.write(Template)
      File.close()
    except:
      print '<ERRO> Ocorreu um erro na gravação do arquivo DUMP.'
    else:
      print 'Arquivo SQL gravado.'

  def __del__(self):
    print 'Ok.'
    
  def Load(self, who, CsvPath):
    try:
      File = open(CsvPath)
      CsvFile = File.readlines()
      File.close()
    except:
      print '<ERRO> Ocorreu um erro no carregamento do arquivo CSV.'
    else:
      if who == 'planilha':
        return self.LoadPlanilha(CsvFile)
      elif who == 'categorias':
        return self.LoadCategorias(CsvFile)

  def LoadPlanilha(self, CsvFile):
    del CsvFile[0] #deleta rotulos
    self.NumReg = len(CsvFile)
    Steps = ceil(self.NumReg/self.MaxInserts)
    Matriz, List = [], []
    for Line in CsvFile:
      Campos = Line.split('|')
      Campos[0] = self.DictCategorias[Campos[0].upper().strip(' ')] #troca da categoria por índice
      Campos[13] = Campos[13]+Campos[14] #DDD + telefone
      Campos[15] = Campos[15]+Campos[16] #DDD_celular + celular
      Campos[17] = Campos[17]+Campos[18] #DDD_comercial + telefone_comercial
      Campos[19] = Campos[19]+Campos[20] #DDD_fax + fax
      del Campos[14], Campos[16], Campos[18], Campos[20]
      #Forma lista de registros
      Dados = []
      for Item in Campos:
        if isinstance(Item, str):
          Temp = Item.replace('\n','').strip(' ')
        else:
          Temp = Item
        Dados.append(Temp)
      List.append('(%s)' % ', '.join(str(D) for D in Dados))
      #Salva Conjunto de Inserts
      if len(List) == self.MaxInserts:
        Matriz.append('"%s",\n' % ',\n'.join(str(L) for L in List))
        List = []
        Steps -= 1
    #Salva Inserts restantes
    if Steps > 0:
        Matriz.append('"%s",\n' % ',\n'.join(str(L) for L in List))
    #Retorna Matriz
    return Matriz

  def LoadCategorias(self, CsvFile):
    List = []
    Index = 0
    for WordLine in CsvFile:
      WordLine = WordLine.replace('\n','').strip(' ')
      if not self.DictCategorias.has_key(WordLine):
        Index += 1
        self.DictCategorias[WordLine.upper()] = Index
      List.append("('%s')" % WordLine)
    return join(List, ',\n')

class SqlTemplate(object):
  
  UseDb = 'USE `%(DbName)s`;\n\n'

  InsertCategoria = '''INSERT INTO `%(DbName)s`.`categoria` (`nome`) VALUES
%(Categorias)s;\n\n'''

  InsertLocacao = '''INSERT INTO `%(DbName)s`.`locacao` (`fk_categoria`,`proprietario`,`responsavel`,`nascimento`,`cpf`,`rg`,`profissao`,`locacao`,`endereco`,`bairro`,`cidade`,`estado`,`cep`,`telefone`,`celular`,`telefone_c`,`fax`,`email`,`observacoes`,`valores`,`som`,`animais`,`pesquisa`,`posicao`,`fotografo`,`fotos_data`,`banco_nome`,`banco_cpf`,`banco_banco`, `banco_agencia`, `banco_conta`) VALUES
%%s;'''

  def __init__(self, NumInserts):
    Inserts = '\n\n'.join(self.InsertLocacao for i in range(NumInserts))
    self.str = self.UseDb + self.InsertCategoria + Inserts

if __name__ == '__main__':
  load = DataLoad()