Notifications
Clear all

Importar dados de uma arquivo *.txt

7 Posts
3 Usuários
0 Reactions
1,989 Visualizações
(@eric-jhon)
Posts: 17
Active Member
Topic starter
 

Boa tarde, pessoa.

Sou novo por aqui :mrgreen:

É o seguinte: tenho um banco de dados em formato *.txt com os dados no seguinte formato: MATRÍCULA, NOME, CPF, PIS/PASEP, DT NASCIMENTO, DT ADMISSÃO E CARGO (separados por espaço simples)

INÍCIO DO ARQUIVO

2014675 FULADO DE TAL 000.000.000-00 1.111.111.111-1 22/22/2222 33/33/3333 AGENTE ADMINISTRATIVO
2013546 SICRANO DE TAL 444.444.444-44 5.555.555.555-5 66/66/6666 77/77/7777 AUXILIAR GERAL

FIM DO ARQUIVO

Estou usando o seguinte código:

Sub ImportarDados()
Dim Arquivo As String, linhaArquivo As String
Dim Matrícula, Nome, CPF, PIS_PASEP, Cargo, DTNascimento, DTAdmissão  As String

On Error GoTo PróximaLinha

Arquivo = CaminhoArquivo.Caption

Open Arquivo For Input As #1

Do Until EOF(1)
    Line Input #1, linhaArquivo
    Line Input #1, linhaArquivo
    Line Input #1, linhaArquivo
    
    Dim TotalDeLinhas
    TotalDeLinhas = Worksheets("Banco de Dados").UsedRange.Rows.Count + 1
    
'#################### Define as variáveis ####################

    'Define a Matrícula
    Matrícula = Mid(linhaArquivo, 1, 7)

    'Define o Nome
InícioNome = 1 'Define o primeiro caractere para iniciar a contagem
FimNome = "." 'Define o ultimo caractere para terminar a contagem
    NomeBruto = InStr(InícioNome, linhaArquivo, FimNome) 'Define a posição do ultimo cactere
    Nome = Mid(linhaArquivo, 8, NomeBruto - 12) 'Define o Nome filtrado

    'Define o CPF
InícioCPF = Len(Matrícula) + Len(Nome) + 1 'Define o primeiro caractere para iniciar a contagem
    CPF = Mid(linhaArquivo, InícioCPF, 15) 'Define o CPF filtrado
    
    'Define o PIS_PASEP
InícioPIS_PASEP = Len(Matrícula) + Len(Nome) + Len(CPF) + 1 'Define o primeiro caractere para iniciar a contagem
    PIS_PASEP = Mid(linhaArquivo, InícioPIS_PASEP, 16) 'Define o PIS_PASEP filtrado

    'Define a Data de Nascimento
InícioNascimento = Len(Matrícula) + Len(Nome) + Len(CPF) + Len(PIS_PASEP) + 1 'Define o primeiro caractere para iniciar a contagem
    DTNascimento = Mid(linhaArquivo, InícioNascimento, 11) 'Define o Nascimento filtrado

    'Define a Data de Admissão
InícioAdmissão = Len(Matrícula) + Len(Nome) + Len(CPF) + Len(PIS_PASEP) + Len(DTNascimento) + 1 'Define o primeiro caractere para iniciar a contagem
    DTAdmissão = Mid(linhaArquivo, InícioAdmissão, 11) 'Define a Admissão filtrado

    'Define o Cargo
InícioCargo = Len(Matrícula) + Len(Nome) + Len(CPF) + Len(PIS_PASEP) + Len(DTNascimento) + Len(DTAdmissão) + 2 'Define o primeiro caractere para iniciar a contagem
    Cargo = Mid(linhaArquivo, InícioCargo, Len(linhaArquivo)) 'Define o Cargo filtrado

'#################### Preenche a Tabela ####################
    
    Worksheets("Banco de Dados").Cells(TotalDeLinhas, 1) = Matrícula 'Matrícula
    Worksheets("Banco de Dados").Cells(TotalDeLinhas, 2) = Nome 'Nome
    Worksheets("Banco de Dados").Cells(TotalDeLinhas, 3) = CPF 'CPF
    Worksheets("Banco de Dados").Cells(TotalDeLinhas, 4) = PIS_PASEP 'PIS/PASEP
    Worksheets("Banco de Dados").Cells(TotalDeLinhas, 5) = DTNascimento 'DTNascimento
    Worksheets("Banco de Dados").Cells(TotalDeLinhas, 6) = DTAdmissão 'DTAdmissão
    Worksheets("Banco de Dados").Cells(TotalDeLinhas, 7) = Cargo 'Cargo

PróximaLinha:
    Resume Next
    
Loop

Close #1

Worksheets("Banco de Dados").Columns("A:G").AutoFit

End Sub

Funciona bem esse código, mas no arquivo *.txt alguns registros estão faltando o campo PIS/PASEP e quando são importados a linha da tabela fica toda bagunçada. Eu penso que se desse pra identificar o padrão dos dados da matrícula, nome, cpf, etc com caracteres curinga (se é que é possível) desse certo, mas eu nem sei como fazer.

Alguém poderia me ajudar?

 
Postado : 09/10/2015 12:06 pm
(@lipetom)
Posts: 24
Eminent Member
 

Ola, se voce delimitar o banco de dados com algum caractere fica bem simples...
estou anexando um exemplo, qualquer duvida da um toque.

 
Postado : 10/10/2015 1:52 am
(@nelson-s)
Posts: 96
Trusted Member
 

Funciona bem esse código, mas no arquivo *.txt alguns registros estão faltando o campo PIS/PASEP e quando são importados a linha da tabela fica toda bagunçada. Eu penso que se desse pra identificar o padrão dos dados da matrícula, nome, cpf, etc com caracteres curinga (se é que é possível) desse certo, mas eu nem sei como fazer.

Alguém poderia me ajudar?

A tabela fica toda bagunçada somente quando falta o campo PIS/PASEP?

Porque se for SOMENTE esse o problema, bastaria fazer o ajuste dos campos após importar o arquivo *.txt.

Nos registros que não têm o campo PIS/PASEP você insere uma célula vazia na coluna PIS/PASEP e desloca os demais campos uma célula para a direita.

 
Postado : 10/10/2015 12:22 pm
(@nelson-s)
Posts: 96
Trusted Member
 

Se for somente para ajustar os registros "desalinhados" essa rotina pode te ajudar.

 
Postado : 12/10/2015 12:02 am
(@eric-jhon)
Posts: 17
Active Member
Topic starter
 

Ola, se voce delimitar o banco de dados com algum caractere fica bem simples...
estou anexando um exemplo, qualquer duvida da um toque.

Não tem como delimitar os campos no banco de dados, pois foram importados de um arquivo PDF, contendo ao todo quase 800 registros.

Ola, se voce delimitar o banco de dados com algum caractere fica bem simples...
estou anexando um exemplo, qualquer duvida da um toque.

Se for somente para ajustar os registros "desalinhados" essa rotina pode te ajudar.

Eu pensei no, mesmo, em ajustar um à um, porém acontece que os registros que não o campo PIS/PASEP os campos seguintes à este último acabam sendo mesclados, ou seja, DT Nascimento com a DT de Admissão e a DT de admissão com o Cargo.

Eu conseguir improvisar um código bem especifico pra resolver o problema dos dados que faltam o PIS/PASEP:

   'Define o PIS_PASEP
InícioPIS_PASEP = Len(Matrícula) + Len(Nome) + Len(CPF) + 1 'Define o primeiro caractere para iniciar a contagem
    PIS_PASEP = Mid(linhaArquivo, InícioPIS_PASEP, 16) 'Define o PIS_PASEP filtrado

    If InStr(1, PIS_PASEP, "/") <> 0 Then
        PIS_PASEP = ""
    End If

Ficando assim o código:

Sub ImportarDados()
Dim Arquivo As String, linhaArquivo As String
Dim Matrícula, Nome, CPF, PIS_PASEP, Cargo, DTNascimento, DTAdmissão  As String

On Error GoTo PróximaLinha

Arquivo = CaminhoArquivo.Caption

Open Arquivo For Input As #1

    Line Input #1, linhaArquivo
    Line Input #1, linhaArquivo

Do Until EOF(1)
    Line Input #1, linhaArquivo

LinhaVálida = InStr(1, linhaArquivo, " ")
If LinhaVálida = 8 Then
    
    Dim TotalDeLinhas
    TotalDeLinhas = Worksheets("Banco de Dados").UsedRange.Rows.Count + 1
    
'#################### Define as variáveis ####################

    'Define a Matrícula
    Matrícula = Mid(linhaArquivo, 1, 7)

    'Define o Nome
InícioNome = 1 'Define o primeiro caractere para iniciar a contagem
FimNome = "." 'Define o ultimo caractere para terminar a contagem
    NomeBruto = InStr(InícioNome, linhaArquivo, FimNome) 'Define a posição do ultimo cactere
    Nome = Mid(linhaArquivo, 8, NomeBruto - 12) 'Define o Nome filtrado

    'Define o CPF
InícioCPF = Len(Matrícula) + Len(Nome) + 1 'Define o primeiro caractere para iniciar a contagem
    CPF = Mid(linhaArquivo, InícioCPF, 15) 'Define o CPF filtrado
    
    'Define o PIS_PASEP
InícioPIS_PASEP = Len(Matrícula) + Len(Nome) + Len(CPF) + 1 'Define o primeiro caractere para iniciar a contagem
    PIS_PASEP = Mid(linhaArquivo, InícioPIS_PASEP, 16) 'Define o PIS_PASEP filtrado

    If InStr(1, PIS_PASEP, "/") <> 0 Then
        PIS_PASEP = ""
    End If

    'Define a Data de Nascimento
InícioNascimento = Len(Matrícula) + Len(Nome) + Len(CPF) + Len(PIS_PASEP) + 2 'Define o primeiro caractere para iniciar a contagem
    DTNascimento = Mid(linhaArquivo, InícioNascimento, 10) 'Define o Nascimento filtrado

    'Define a Data de Admissão
InícioAdmissão = Len(Matrícula) + Len(Nome) + Len(CPF) + Len(PIS_PASEP) + Len(DTNascimento) + 3 'Define o primeiro caractere para iniciar a contagem
    DTAdmissão = Mid(linhaArquivo, InícioAdmissão, 10) 'Define a Admissão filtrado

    'Define o Cargo
InícioCargo = Len(Matrícula) + Len(Nome) + Len(CPF) + Len(PIS_PASEP) + Len(DTNascimento) + Len(DTAdmissão) + 4 'Define o primeiro caractere para iniciar a contagem
    Cargo = Mid(linhaArquivo, InícioCargo, Len(linhaArquivo)) 'Define o Cargo filtrado

'#################### Preenche a Tabela ####################
    Dim rngCelula As Range

    Worksheets("Banco de Dados").Cells(TotalDeLinhas, 1) = Trim(Matrícula) 'Matrícula
    Worksheets("Banco de Dados").Cells(TotalDeLinhas, 2) = Trim(Nome) 'Nome
    Worksheets("Banco de Dados").Cells(TotalDeLinhas, 3) = Trim(CPF) 'CPF
    Worksheets("Banco de Dados").Cells(TotalDeLinhas, 4) = Trim(PIS_PASEP) 'PIS/PASEP
    Worksheets("Banco de Dados").Cells(TotalDeLinhas, 5) = DTNascimento 'DTNascimento
        For Each rngCelula In Worksheets("Banco de Dados").Cells(TotalDeLinhas, 5)
            rngCelula.FormulaLocal = rngCelula.Value
        Next rngCelula
    Worksheets("Banco de Dados").Cells(TotalDeLinhas, 6) = DTAdmissão 'DTAdmissão
        For Each rngCelula In Worksheets("Banco de Dados").Cells(TotalDeLinhas, 6)
            rngCelula.FormulaLocal = rngCelula.Value
        Next rngCelula
    Worksheets("Banco de Dados").Cells(TotalDeLinhas, 7) = Trim(Cargo) 'Cargo

PróximaLinha: Resume Next

End If

Loop

Close #1

Worksheets("Banco de Dados").Columns("A:G").AutoFit

End Sub

Deixarei o tópico aberto ainda algum tempo, afim de que alguém possa, se é que é possível, resolver a questão de uma forma menos improvisada.

 
Postado : 12/10/2015 4:51 pm
(@nelson-s)
Posts: 96
Trusted Member
 

Eu pensei no, mesmo, em ajustar um à um, porém acontece que os registros que não o campo PIS/PASEP os campos seguintes à este último acabam sendo mesclados, ou seja, DT Nascimento com a DT de Admissão e a DT de admissão com o Cargo.

Foi por isso que perguntei se o problema era somente o deslocamento do campo PIS/PASEP. Então o problema não é somente a ausência do campo PIS/PASEP. Seria interessante disponibilizar um arquivo com erros de importação para saber o que realmente acontece. Não adianta tentar resolver um problema quando são vários os problemas que podem estar ocorrendo.

 
Postado : 13/10/2015 4:20 pm
(@eric-jhon)
Posts: 17
Active Member
Topic starter
 

Segue arquivo com os dados importados bagunçados.

 
Postado : 14/10/2015 11:54 am