sexta-feira, 4 de fevereiro de 2011

Como Importar um arquivo CSV e mostrar os dados em um Browse?

//+-----------------------------------------------------------------------------+
//| PROGRAMA  | CSV2TELA    | By LB&B Consultores Associados [ Balboena ] |  2011 |
//+-----------------------------------------------------------------------------+
//| DESCRIÇÃO | Importa dados de arquivo CSV e mostra browse dos dados          |
//+-----------------------------------------------------------------------------+
//| HISTORICO DAS ALTERAÇÕES                                                    |
//+-----------------------------------------------------------------------------+
//| DATA     | AUTOR                | DESCRICAO                                 |
//+-----------------------------------------------------------------------------+
//|          |                      |                                           |
//+-----------------------------------------------------------------------------+
#INCLUDE "RWMAKE.CH"
#INCLUDE "TOPCONN.CH"
#INCLUDE "COLORS.CH"


User Function CSV2TELA()

  Private nPos
  Private x
  Private cLinha
  Private cCab    := ""
  Private nIni
  Private i       := 0
  Private aCSV    := {}                           
  Private nCols   := 0
  Private pArquivo:= "ARQUIVO.CSV"
  Private pMatriz := {}
  Private pUsaCab := .F. 
 
     If ( !File(pArquivo) )
          MsgBox("ArquiVO CSV não encontrado" + CHR(13) + " Formato ")
          Return
     Else
        Processa({|| fImpDados()})
     Endif
    
Return    
    

Static Function fImpDados
   
    ProcRegua(2000)


       //Abrindo o arquivo
       FT_FUse(pArquivo)
       FT_FGoTop()

       //Capturando as linhas do arquivo
       do while ( !FT_FEof() )
          IncProc()
          if ( Empty(cCab) )
               cCab := FT_FREADLN()
          endif
          if ( pUsaCab )
               AADD(aCSV,FT_FREADLN())
          elseif ( !pUsaCab ) .and. ( i > 0 )
               AADD(aCSV,FT_FREADLN())
          endif
          i++
          FT_FSkip()
       enddo
       FT_FUSE()

       //Pegando o numero de colunas com base no cabecalho
       for i := 1 to Len(cCab)
           IncProc()
           nPos := At(";",cCab)
           if ( nPos > 0 )
               nCols+= 1
               cCab := SubStr(cCab,nPos+1,Len(cCab)-nPos)
           endif
       next

       //Definindo o tamanho da Matriz que recebera os dados
       pMatriz := Array(Len(aCSV),nCols+1)

       // Carregando os dados
       for i := 1 to Len(aCSV)
           IncProc()
           cLinha := aCSV[i]
           for x := 1 to nCols+1
               nPos := At(";",cLinha)
               if ( nPos > 0 )
                    pMatriz[i,x] := AllTrim(SubStr(cLinha,1,nPos-1))
                    cLinha := SubStr(cLinha,nPos+1,Len(cLinha)-nPos)
               else
                    pMatriz[i,x] := AllTrim(cLinha)
                    cLinha := ""
               endif
           next x
       next i


  
Private aDados := {}
AADD(aDados, {"Coluna1","Coluna1", "@!" , "10" , "00"})    
AADD(aDados, {"Coluna2","Coluna2", "@!" , "50" , "00"})
AADD(aDados, {"Coluna3","Coluna3", "@!" , "05" , "00"})         AADD(aDados, {"Coluna4","Coluna4", "@!" , "05" , "00"})  
      
    Private aCampos := {}
    AADD(aCampos, {"Coluna1"    , "C" , 10 , 00})
    AADD(aCampos, {"Coluna2"      , "C" , 50 , 00})
    AADD(aCampos, {"Coluna3" , "C" , 05 , 00})    
    AADD(aCampos, {"Coluna4"   , "C" , 05 , 00})  
 
       cArqTrab := CriaTrab(aCampos)
       dbUseArea( .T.,, cArqTrab, "DADOS",.F.,.F.)  
    
       For inx := 1 to Len(pMatriz)
           RECLOCK("DADOS",.T.)
           DADOS->Coluna1  := pMatriz[inx][1]
           DADOS->Coluna2   := pMatriz[inx][2]
           DADOS->Coluna3 := pMatriz[inx][3]
           MSUNLOCK()
       Next inx
    
       DbSelectArea("DADOS")                       
       DbGotop()
    
       @ 000,000 TO 800,900 DIALOG oDlg TITLE "dados csv"      
@ 010,010 to 370,430 Browse "DADOS" Fields aDados
       @ 380,390 BMPBUTTON TYPE 2 ACTION Close(oDlg)      
      
    ACTIVATE DIALOG oDlg CENTERED
                            
       DbSelectArea("DADOS")
       DbCloseArea("DADOS")            

Return


by Balboena (www.lbeb.com.br)

Um comentário: