Como Ler Arquivos Linha por Linha no Windows PowerShell

  1. Ler Arquivo Linha por Linha no PowerShell Usando Get-Content com um Loop ForEach
  2. Ler Arquivo Linha por Linha no PowerShell Usando Get-Content com Foreach-Object
  3. Usando a Classe [System.IO.File] no PowerShell Para Ler Arquivo Linha por Linha
  4. Usando a Classe System.IO.StreamReader no PowerShell Para Ler Arquivo Linha por Linha
  5. Conclusão
Como Ler Arquivos Linha por Linha no Windows PowerShell

No PowerShell do Windows, podemos usar o cmdlet Get-Content para ler arquivos de um arquivo. No entanto, o cmdlet carregará todo o conteúdo do arquivo na memória de uma vez, o que falhará ou congelará em arquivos grandes.

Para resolver esse problema, o que podemos fazer é ler os arquivos linha por linha, e este artigo mostrará como.

Antes de começarmos, é melhor se criarmos um arquivo de texto de exemplo com várias linhas. Por exemplo, eu criei um file.txt contendo as seguintes linhas.

file.txt:

one
two
three
four
five
six
seven
eight
nine
ten

De acordo com a Microsoft, uma expressão regular é um padrão usado para corresponder ao texto. Pode ser composto por caracteres literais, operadores e outras construções. Este artigo vai tentar diferentes scripts envolvendo uma variável padrão chamada Expressões Regulares, denotada por $regex.

Ler Arquivo Linha por Linha no PowerShell Usando Get-Content com um Loop ForEach

Discutimos inicialmente que o cmdlet Get-Content tem suas falhas quando estamos carregando um arquivo grande, pois irá carregar o conteúdo do arquivo na memória de uma só vez. No entanto, podemos melhorá-lo carregando as linhas uma por uma usando o loop foreach.

Código de Exemplo:

foreach ($line in Get-Content .\file.txt) {
    if ($line -match $regex) {
        Write-Output $line
    }
}

Aqui está uma explicação passo a passo do processo:

  1. Obter o Conteúdo do Arquivo:

    Começamos usando o cmdlet Get-Content para ler o conteúdo do arquivo.

    Get-Content .\file.txt
    

    Substitua "file.txt" pelo caminho do seu arquivo.

  2. Iterar Sobre Cada Linha:

    Em seguida, usamos um loop ForEach para iterar sobre cada linha no arquivo. O loop atribui cada linha a uma variável, $line, uma de cada vez.

    Dentro do loop, você pode substituir Write-Host $line pelo código que processa cada linha conforme suas necessidades. Neste exemplo, estamos simplesmente exibindo cada linha usando Write-Host, mas você pode realizar qualquer ação desejada.

Ler Arquivo Linha por Linha no PowerShell Usando Get-Content com Foreach-Object

Para ler um arquivo linha por linha no PowerShell usando Get-Content com Foreach-Object, siga estes passos:

  1. Use o Cmdlet Get-Content:

    Começamos usando o cmdlet Get-Content para ler o conteúdo do arquivo. O cmdlet Get-Content lê cada linha do arquivo e as envia como objetos em um pipeline.

    powershellCopy codeGet-Content -Path "example.txt" | ForEach-Object {
        # Process each line here
        $_  # $_ represents the current line
    }
    

Substitua "example.txt" pelo caminho do seu arquivo.

  1. Loop Foreach-Object:

    Em seguida, usamos o cmdlet Foreach-Object (% é um alias para Foreach-Object) para iterar sobre cada linha no pipeline. Dentro do bloco de script (o código dentro de {}), você pode processar cada linha usando $_, que representa a linha atual sendo processada.

    powershellCopy codeGet-Content -Path "example.txt" | ForEach-Object {
        # Process each line here
        $_  # $_ represents the current line
    }
    

    Dentro desse loop, você pode realizar quaisquer ações necessárias em cada linha.

Exemplo de Código Completo Funcional

Aqui está um exemplo completo de código funcional que lê um arquivo linha por linha e exibe cada linha:

powershellCopy code# Specify the path to the file
$filePath = "example.txt"

# Check if the file exists
if (Test-Path $filePath) {
    # Read the file line by line and process each line
    Get-Content -Path $filePath | ForEach-Object {
        # Process each line here
        Write-Host $_
    }
} else {
    Write-Host "File not found: $filePath"
}

Neste código:

  • Especificamos o caminho para o arquivo usando a variável $filePath.
  • Usamos o cmdlet Test-Path para verificar se o arquivo existe.
  • Se o arquivo existir, usamos Get-Content para ler seu conteúdo e passar para Foreach-Object para processamento.
  • Dentro do bloco de script do Foreach-Object, usamos Write-Host $_ para exibir cada linha.

Usando a Classe [System.IO.File] no PowerShell Para Ler Arquivo Linha por Linha

Para ler um arquivo linha por linha no PowerShell usando a classe [System.IO.File], siga estes passos:

  1. Especifique o Caminho do Arquivo:

    Comece especificando o caminho para o arquivo que você deseja ler. Substitua "example.txt" pelo caminho real do seu arquivo.

    powershellCopy code
    $filePath = "example.txt"
    
  2. Verifique se o Arquivo Existe:

    Antes de tentar ler o arquivo, é uma boa prática verificar se o arquivo existe usando o cmdlet Test-Path:

    powershellCopy codeif (Test-Path $filePath) {
        # File exists, proceed with reading
    } else {
        Write-Host "File not found: $filePath"
    }
    
  1. Ler o Arquivo Linha Por Linha:

    Assim que você verificar que o arquivo existe, pode usar a classe [System.IO.File] para ler o arquivo linha por linha. Aqui está o código para fazer isso:

    powershellCopy codetry {
        $lines = [System.IO.File]::ReadLines($filePath)
        foreach ($line in $lines) {
            # Process each line here
            Write-Host $line
        }
    } catch {
        Write-Host "Error reading the file: $_"
    }
    

    Neste código:

    • Usamos o método ReadLines da classe [System.IO.File] para ler o arquivo linha por linha e armazenamos as linhas na variável $lines.
    • Em seguida, usamos um loop foreach para iterar sobre cada linha em $lines e processá-la. Neste exemplo, estamos simplesmente exibindo cada linha usando Write-Host, mas você pode realizar qualquer ação desejada.

Exemplo de Código Completo Funcional

Aqui está um exemplo completo de código funcional que lê um arquivo linha por linha e exibe cada linha:

powershellCopy code# Specify the path to the file
$filePath = "example.txt"

# Check if the file exists
if (Test-Path $filePath) {
    try {
        # Read the file line by line
        $lines = [System.IO.File]::ReadLines($filePath)
        foreach ($line in $lines) {
            # Process each line here
            Write-Host $line
        }
    } catch {
        Write-Host "Error reading the file: $_"
    }
} else {
    Write-Host "File not found: $filePath"
}

Neste código:

  • Especificamos o caminho para o arquivo usando a variável $filePath.
  • Verificamos se o arquivo existe usando Test-Path.
  • Se o arquivo existir, usamos o método [System.IO.File]::ReadLines() para ler o arquivo linha por linha e processar cada linha usando um loop foreach.
  • Incluímos tratamento de erros para capturar quaisquer exceções que possam ocorrer durante a leitura do arquivo.

Usando a Classe System.IO.StreamReader no PowerShell Para Ler Arquivo Linha por Linha

Para ler um arquivo linha por linha no PowerShell usando a classe System.IO.StreamReader, siga estes passos:

  1. Especifique o Caminho do Arquivo:

    Comece especificando o caminho para o arquivo que você deseja ler. Substitua "example.txt" pelo caminho real do seu arquivo.

    powershellCopy code
    $filePath = "example.txt"
    
  2. Verifique se o Arquivo Existe:

    Antes de tentar ler o arquivo, é uma boa prática verificar se o arquivo existe usando o cmdlet Test-Path:

    powershellCopy codeif (Test-Path $filePath) {
        # File exists, proceed with reading
    } else {
        Write-Host "File not found: $filePath"
    }
    
  3. Ler o Arquivo Linha por Linha:

    Assim que você verificar que o arquivo existe, pode usar a classe System.IO.StreamReader para ler o arquivo linha por linha. Aqui está o código para fazer isso:

powershellCopy codetry {
    $reader = [System.IO.StreamReader]::new($filePath)
    while ($reader.Peek() -ge 0) {
        $line = $reader.ReadLine()
        # Process each line here
        Write-Host $line
    }
    $reader.Close()
} catch {
    Write-Host "Error reading the file: $_"
}

Neste código:

  • Criamos uma nova instância de System.IO.StreamReader usando [System.IO.StreamReader]::new($filePath), onde $filePath é o caminho para o arquivo.
  • Usamos um loop while para ler o arquivo linha por linha. A condição $reader.Peek() -ge 0 garante que continuemos lendo até o final do arquivo ser alcançado.
  • Dentro do loop, usamos $reader.ReadLine() para ler cada linha e processá-la conforme necessário. Neste exemplo, estamos simplesmente exibindo cada linha usando Write-Host, mas você pode realizar qualquer ação desejada.
  • Por fim, fechamos o StreamReader usando $reader.Close() para liberar os recursos do arquivo.

Exemplo de Código Completo Funcional

Aqui está um exemplo completo de código funcional que lê um arquivo linha por linha e exibe cada linha:

powershellCopy code# Specify the path to the file
$filePath = "example.txt"

# Check if the file exists
if (Test-Path $filePath) {
    try {
        # Create a StreamReader to read the file
        $reader = [System.IO.StreamReader]::new($filePath)

        # Read the file line by line
        while ($reader.Peek() -ge 0) {
            $line = $reader.ReadLine()
            # Process each line here
            Write-Host $line
        }
        
        # Close the StreamReader
        $reader.Close()
    } catch {
        Write-Host "Error reading the file: $_"
    }
} else {
    Write-Host "File not found: $filePath"
}

Neste código:

  • Especificamos o caminho para o arquivo usando a variável $filePath.
  • Verificamos se o arquivo existe usando Test-Path.
  • Se o arquivo existir, criamos uma instância de System.IO.StreamReader para ler o arquivo linha por linha e processar cada linha usando um loop while.
  • Incluímos tratamento de erros para capturar quaisquer exceções que possam ocorrer durante a leitura do arquivo.

Conclusão

Em resumo, o PowerShell oferece vários métodos versáteis para ler arquivos linha por linha, atendendo a diversas necessidades de script e automação. Get-Content com um Loop ForEach é uma escolha amigável para tarefas simples, oferecendo simplicidade e legibilidade. Get-Content com Foreach-Object aprimora a flexibilidade, tornando-o adequado para operações mais intrincadas e tarefas de filtragem dentro do pipeline.

Para cenários que exigem maior controle e tratamento abrangente de erros, a classe [System.IO.File] oferece uma solução poderosa. Este método permite ajustar operações de arquivos e lidar graciosamente com exceções, tornando-o bem-sucedido para scripts robustos e à prova de erros.

Em situações em que você está lidando com arquivos grandes e a eficiência de memória é crucial, a classe System.IO.StreamReader se destaca. Ela permite que você leia arquivos de forma eficiente enquanto gerencia os recursos de memória de maneira mais eficaz, garantindo um processamento suave de grandes conjuntos de dados.

Em última análise, a escolha do método depende de seus requisitos específicos de script, tamanho do arquivo e complexidade do processamento. Ao aproveitar esses métodos, você pode ler arquivos linha por linha no PowerShell, abordando efetivamente uma ampla gama de tarefas relacionadas a arquivos em seus fluxos de trabalho de automação.

Está gostando dos nossos tutoriais? Inscreva-se no DelftStack no YouTube para nos apoiar na criação de mais vídeos tutoriais de alta qualidade. Inscrever-se
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn

Artigo relacionado - PowerShell File