none
Procurar linha de um arquivo de texto com base num valor de outro arquivo txt RRS feed

  • Pergunta

  • Estou com uma duvida e gostaria de uma ajuda, Estou elaborando em powershell um script que busca informações e 2 arquivos diferentes:

    Tenho 2 arquivos de textos:

    Txt1 = "c:\temp\file.txt"

    Txt2 = "c:\temp\file2.txt"

    Txt1:

        Codigo_pessoa,Nome,matricula
        02,Paulo,02060389
        3425,Maria,02060390

        854,Pedro,02060377

    Txt2:

        Codigo_Pessoa,Nome,Cargo,Departamento
        02,Paulo,Auxiliar,Almoxarifado
        3425,Maria,Analista,Financeiro

        854,Pedro,Advogado,Juridico

    Estou necessitando ler a linha de um arquivo que contem a mesma informação que contem no outro, por exemplo, pelo código de pessoa, informação existente nos 2 arquivos, queria trazer somente a linha daquele usuário informado.

    Qual comando posso utilizar para pegar somente o cargo e departamento do Pedro utilizando seu código de pessoa?

    sexta-feira, 24 de março de 2017 17:36

Respostas

  • Como são arquivos TXT com o conteúdo separados por vírgula, ou seja, com a estrutura de um arquivo CSV, isso é simples de ser feito importando os arquivos como CSV e dois laços ForEach.

    $File1 = Import-Csv C:\temp\File1.txt
    $File2 = Import-Csv C:\temp\File2.txt
    ForEach ($Line1 in $File1) {
        ForEach ($Line2 in $File2) {
            If($Line2.Codigo_pessoa -eq $Line1.Codigo_pessoa) {
                $Line2
            }
        }
    }

    Cara, Que dica fenomenal. Valeu! Simples e Objetivo. Não sou frequentante assíduo do fórum então nem sei se pode, mas caso seja possível, me passe seu e-mail. Obrigado pela dica a você, e a todos que contribuíram no fórum.

    Resolvido

    quarta-feira, 29 de março de 2017 13:58

Todas as Respostas

  • Em qual linguagem de programação você precisa de saber o comando?
    sexta-feira, 24 de março de 2017 18:22
  • segue um exemplo em VBS que faz a leitura no arquivo de texto

    https://social.technet.microsoft.com/Forums/pt-BR/5da161f0-bd57-4bc0-9e19-4ec1b3303683/vbs-para-ler-arquivo-de-texto-e-coletar-valores-de-linhas-diferentes?forum=scriptadminpt

    strNomeArquivo = "D:\arquivo.txt"
    strArquivoDiferente = "D:\arquivoLog.txt"
    
    Dim fso
    Set fso = CreateObject("Scripting.Filesystemobject")
    
    If fso.FileExists(strNomeArquivo) Then
      Set obj = fso.OpenTextFile(strNomeArquivo,1,true)
       Set Obj2 = fso.OpenTextFile(strArquivoDiferente,2, True)
       
      contLinha = 0
      Do While obj.AtEndOfStream = False
          contLinha = contLinha + 1
           linha= obj.ReadLine
           
           If contlinha = 2 Or contlinha = 6 Or contlinha = 13 Or contlinha = 17 then
                 obj2.WriteLine(linha)
           End If  
            
       Loop
    
    
    Else
     MsgBox("Arquivo não encontrado!")
    End If

    sexta-feira, 24 de março de 2017 18:27
  • Felipe!

    Escrevi o script conforme sua necessidade, verifica se erra isso que você precisava.

    Uma outra opção, seria você inserir o conteúdo txt em uma base de dados, essa seria na verdade a melhor opção já que parece que você precisa relacionar os dados.

    varCod = InputBox("Por favor, informar o codigo do usuário!")
    
    strNomeArquivo = "c:\temp\file.txt"
    strArquivoDiferente = "c:\temp\file2.txt"
    strResposta = ""
    
    Dim fso
    Set fso = CreateObject("Scripting.Filesystemobject")
    
    If fso.FileExists(strNomeArquivo) Then
      Set obj = fso.OpenTextFile(strNomeArquivo,1,true)
       Set Obj2 = fso.OpenTextFile(strArquivoDiferente,1, True)
       
      contLinha = 0
      Do While obj.AtEndOfStream = False
          contLinha = contLinha + 1
           linha= obj.ReadLine
           linha = Split(linha,",")
           If linha(0) = varCod  then
                 strResposta = linha(0) & "," & linha(1) & "," & linha(2)
           End If  
       Loop
    
      contLinha = 0
      Do While obj2.AtEndOfStream = False
          contLinha = contLinha + 1
           linha= obj2.ReadLine
           linha = Split(linha,",")
           If linha(0) = varCod  then
                 strResposta = strResposta & linha(2) & "," & linha(3)
           End If  
       Loop
      
      MsgBox(strResposta)
    
    Else
     MsgBox("Arquivo não encontrado!")
    End If

      Caso tenha achado útil, por favor, não deixe de votar como útil ou marcar como resposta.



    sexta-feira, 24 de março de 2017 19:15
  • Olá desculpe não informar, preciso fazer isso em Powershell.


    sexta-feira, 24 de março de 2017 19:58
  • Felipe!

    Escrevi o script conforme sua necessidade, verifica se erra isso que você precisava.

    Uma outra opção, seria você inserir o conteúdo txt em uma base de dados, essa seria na verdade a melhor opção já que parece que você precisa relacionar os dados.

    varCod = InputBox("Por favor, informar o codigo do usuário!")
    
    strNomeArquivo = "c:\temp\file.txt"
    strArquivoDiferente = "c:\temp\file2.txt"
    strResposta = ""
    
    Dim fso
    Set fso = CreateObject("Scripting.Filesystemobject")
    
    If fso.FileExists(strNomeArquivo) Then
      Set obj = fso.OpenTextFile(strNomeArquivo,1,true)
       Set Obj2 = fso.OpenTextFile(strArquivoDiferente,1, True)
       
      contLinha = 0
      Do While obj.AtEndOfStream = False
          contLinha = contLinha + 1
           linha= obj.ReadLine
           linha = Split(linha,",")
           If linha(0) = varCod  then
                 strResposta = linha(0) & "," & linha(1) & "," & linha(2)
           End If  
       Loop
    
      contLinha = 0
      Do While obj2.AtEndOfStream = False
          contLinha = contLinha + 1
           linha= obj2.ReadLine
           linha = Split(linha,",")
           If linha(0) = varCod  then
                 strResposta = strResposta & linha(2) & "," & linha(3)
           End If  
       Loop
      
      MsgBox(strResposta)
    
    Else
     MsgBox("Arquivo não encontrado!")
    End If

      Caso tenha achado útil, por favor, não deixe de votar como útil ou marcar como resposta.



    Cara, consegue o comando em powershell? Só preciso trazer todas as colunas de uma linha conforme informada.


    sexta-feira, 24 de março de 2017 20:07
  • Amigo,

    Em powershell não sei bem como fazer, se for em vbs é mais fácil.

    Daqui a pouco outro amigo do forum deve te ajudar com o comando em powershell.

    Se precisar do código em VBS é só avisar.

    sexta-feira, 24 de março de 2017 20:11
  • Felipe,

    Como tinha mencionado não conheço muito de powershell, mas tentei fazer uma versão, talvez seja só você fazer algumas modificações para atender sua necessidade.

    $file = new-object System.IO.StreamReader("c:\temp\file.txt")
    try {
        while (($line = $file.ReadLine()) -ne $null) {
              $var = $line.split("{,}")
              ConsultaArq2 $var[0]
            
        }
    }
    finally {
        $file.Close()
    }
    
    function ConsultaArq2 ($var){
    
    $file2 = new-object System.IO.StreamReader("c:\temp\file2.txt")
    
    try {
        while (($line2 = $file2.ReadLine()) -ne $null) {
                $var2 = $line2.split("{,}")
                
                if ($var = $var2 )
                {
                echo $var[0] "," $var[01] "," $var[2] "," $var2[2] "," $var2[3]
                }
            
        }
    }
    finally {
        $file2.Close()
    }
    
    }

    sexta-feira, 24 de março de 2017 21:24
  • Como são arquivos TXT com o conteúdo separados por vírgula, ou seja, com a estrutura de um arquivo CSV, isso é simples de ser feito importando os arquivos como CSV e dois laços ForEach.

    $File1 = Import-Csv C:\temp\File1.txt
    $File2 = Import-Csv C:\temp\File2.txt
    ForEach ($Line1 in $File1) {
        ForEach ($Line2 in $File2) {
            If($Line2.Codigo_pessoa -eq $Line1.Codigo_pessoa) {
                $Line2
            }
        }
    }

    • Sugerido como Resposta Carlos_rodrigues quarta-feira, 29 de março de 2017 14:40
    • Não Sugerido como Resposta Carlos_rodrigues quarta-feira, 29 de março de 2017 14:40
    sábado, 25 de março de 2017 13:08
  • Ok seguindo o mesmo raciocínio de que são arquivos CSV teríamos que fazer uma busca nos 2 arquivos pelo código digitado por um operador e comparando com o campo Codigo_pessoa nos 2 arquivos e após selecionarmos as propriedades desejadas e formatarmos a saída:
    Clear-Host
    Write-Host -ForegroundColor Green "================================ BUSCA POR USUARIO ==============================="
    Write-Host ""
    $codigo = Read-Host "Digite o codigo do usuário "
    $file1 = import-csv c:\temp\file.txt
    $file2 = import-csv c:\temp\file2.txt
    $matricula = $file1 | Where-Object {$_.Codigo_Pessoa -eq $codigo} | select-Object matricula
    if ($matricula)
    {
        $file2 | Where-Object {$_.Codigo_Pessoa -eq $codigo} | Select-Object -Property Codigo_Pessoa,Nome,@{Name="Matricula"; Expression = {$($matricula.matricula)}},Departamento,Cargo | format-table -auto
       }
     else
     {
      "`r`n Nenhum usuário encontrado com o código $codigo `r`n"
     }
    
    

    sábado, 25 de março de 2017 14:51
  • Update do primeiro exemplo em powershell

    $file = new-object System.IO.StreamReader("c:\temp\file.txt")
    
        while (($line = $file.ReadLine()) -ne $null) {
              $var = $line.split("{,}")
              ConsultaArq2 $var[0]
            
        }
    
    
    function ConsultaArq2 ($cod){
    
    $file2 = new-object System.IO.StreamReader("c:\temp\file2.txt")
    
        while (($line2 = $file2.ReadLine()) -ne $null) {
                $var2 = $line2.split("{,}")
                
                
        if ($var[0] -eq $var2[0] -and $var[0] -eq $cod -and $cod -eq $var2[0])           
           {
            $log = $var[0] + "," + $var[01] +  "," + $var[2] + "," + $var2[2] + "," + $var2[3] >> c:\temp\log.txt
           }
    
        }
    
    }



    segunda-feira, 27 de março de 2017 14:45
  • Como são arquivos TXT com o conteúdo separados por vírgula, ou seja, com a estrutura de um arquivo CSV, isso é simples de ser feito importando os arquivos como CSV e dois laços ForEach.

    $File1 = Import-Csv C:\temp\File1.txt
    $File2 = Import-Csv C:\temp\File2.txt
    ForEach ($Line1 in $File1) {
        ForEach ($Line2 in $File2) {
            If($Line2.Codigo_pessoa -eq $Line1.Codigo_pessoa) {
                $Line2
            }
        }
    }

    Cara, Que dica fenomenal. Valeu! Simples e Objetivo. Não sou frequentante assíduo do fórum então nem sei se pode, mas caso seja possível, me passe seu e-mail. Obrigado pela dica a você, e a todos que contribuíram no fórum.

    Resolvido

    quarta-feira, 29 de março de 2017 13:58
  • Felipe,

    Então marca a resposta do 4HorsemenOfDaIT como "resposta" é uma forma de incentivar os participantes do forum e ajudar outras que procuram algo semelhante.

     

    quarta-feira, 29 de março de 2017 14:09
  • Felipe,

    Então marca a resposta do 4HorsemenOfDaIT como "resposta" é uma forma de incentivar os participantes do forum e ajudar outras que procuram algo semelhante.

     

    OK. MARCADO! VALEU!

    Resolvido

    quarta-feira, 29 de março de 2017 20:16
  • Só mais uma duvida estava pensando em usar um terceiro arquivo de texto, como faria? Seria semelhante abaixo? ainda não cheguei fazer testes com terceiro arquivo, então não sei se o comando abaixo vai funcionar:

    ForEach ($Line1 in $File1) { ForEach ($Line2 in $File2) {

    ForEach ($Line3 in $File3) {

    If($Line2.Codigo_pessoa -eq $Line1.Codigo_pessoa) { $Line2 }

    } } }


    Resolvido

    quarta-feira, 29 de março de 2017 20:19