Cómo leer archivos línea por línea en Windows PowerShell

  1. Leer archivo línea por línea en PowerShell usando Get-Content con un bucle ForEach
  2. Leer archivo línea por línea en PowerShell usando Get-Content con Foreach-Object
  3. Usar la clase [System.IO.File] en PowerShell para leer un archivo línea por línea
  4. Usar la clase System.IO.StreamReader en PowerShell para leer un archivo línea por línea
  5. Conclusión
Cómo leer archivos línea por línea en Windows PowerShell

En Windows PowerShell, podemos usar el cmdlet Get-Content para leer archivos desde un archivo. Sin embargo, el cmdlet cargará todo el contenido del archivo en la memoria de una vez, lo que fallará o congelará archivos grandes.

Para resolver este problema, lo que podemos hacer es leer los archivos línea por línea, y este artículo te mostrará cómo.

Antes de comenzar, es mejor si creamos un archivo de texto de muestra con múltiples líneas. Por ejemplo, he creado un file.txt que contiene las siguientes líneas.

file.txt:

one
two
three
four
five
six
seven
eight
nine
ten

Según Microsoft, una expresión regular es un patrón utilizado para hacer coincidir el texto. Puede estar compuesta de caracteres literales, operadores y otros constructos. Este artículo probará diferentes scripts que involucran una variable estándar llamada Expresiones Regulares, denotada por $regex.

Leer archivo línea por línea en PowerShell usando Get-Content con un bucle ForEach

Hemos discutido inicialmente que el cmdlet Get-Content tiene sus fallos cuando estamos cargando un archivo grande, ya que cargará el contenido del archivo en la memoria de una vez. Sin embargo, podemos mejorarlo cargando las líneas una por una usando el bucle foreach.

Código de ejemplo:

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

Aquí hay una explicación paso a paso del proceso:

  1. Obtener el contenido del archivo:

    Comenzamos utilizando el cmdlet Get-Content para leer el contenido del archivo.

    Get-Content .\file.txt
    

    Reemplaza "file.txt" con la ruta a tu archivo.

  2. Iterar sobre cada línea:

    A continuación, usamos un bucle ForEach para iterar sobre cada línea en el archivo. El bucle asigna cada línea a una variable, $line, una a la vez.

    Dentro del bucle, puedes reemplazar Write-Host $line con el código que procesa cada línea según tus requisitos. En este ejemplo, simplemente estamos mostrando cada línea usando Write-Host, pero puedes realizar cualquier acción deseada.

Leer archivo línea por línea en PowerShell usando Get-Content con Foreach-Object

Para leer un archivo línea por línea en PowerShell utilizando Get-Content con Foreach-Object, sigue estos pasos:

  1. Usa el cmdlet Get-Content:

    Comenzamos utilizando el cmdlet Get-Content para leer el contenido del archivo. El cmdlet Get-Content lee cada línea del archivo y las devuelve como objetos en una canalización.

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

Reemplaza "example.txt" con la ruta a tu archivo.

  1. Bucle Foreach-Object:

    A continuación, usamos el cmdlet Foreach-Object (% es un alias para Foreach-Object) para iterar sobre cada línea en la canalización. Dentro del bloque de script (el código dentro de {}), puedes procesar cada línea utilizando $_, que representa la línea actual que se está procesando.

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

    Dentro de este bucle, puedes realizar cualquier acción que necesites en cada línea.

Ejemplo completo de código funcional

Aquí hay un ejemplo completo de código que lee un archivo línea por línea y muestra cada línea:

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"
}

En este código:

  • Especificamos la ruta al archivo utilizando la variable $filePath.
  • Usamos el cmdlet Test-Path para verificar si el archivo existe.
  • Si el archivo existe, usamos Get-Content para leer su contenido y pasarlo a Foreach-Object para su procesamiento.
  • Dentro del bloque de script Foreach-Object, usamos Write-Host $_ para mostrar cada línea.

Usar la clase [System.IO.File] en PowerShell para leer un archivo línea por línea

Para leer un archivo línea por línea en PowerShell utilizando la clase [System.IO.File], sigue estos pasos:

  1. Especifica la ruta del archivo:

    Comienza especificando la ruta al archivo que deseas leer. Reemplaza "example.txt" con la ruta real a tu archivo.

    powershellCopy code
    $filePath = "example.txt"
    
  2. Verifica si el archivo existe:

    Antes de intentar leer el archivo, es una buena práctica verificar si el archivo existe utilizando el cmdlet Test-Path:

    powershellCopy codeif (Test-Path $filePath) {
        # File exists, proceed with reading
    } else {
        Write-Host "File not found: $filePath"
    }
    
  1. Leer el archivo línea por línea:

    Una vez que hayas verificado que el archivo existe, puedes usar la clase [System.IO.File] para leer el archivo línea por línea. Aquí está el código para hacerlo:

    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: $_"
    }
    

    En este código:

    • Usamos el método ReadLines de la clase [System.IO.File] para leer el archivo línea por línea, y almacenamos las líneas en la variable $lines.
    • Luego usamos un bucle foreach para iterar sobre cada línea en $lines y procesarla. En este ejemplo, simplemente estamos mostrando cada línea usando Write-Host, pero puedes realizar cualquier acción deseada.

Ejemplo completo de código funcional

Aquí hay un ejemplo completo de código que lee un archivo línea por línea y muestra cada línea:

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"
}

En este código:

  • Especificamos la ruta al archivo utilizando la variable $filePath.
  • Verificamos si el archivo existe utilizando Test-Path.
  • Si el archivo existe, usamos el método [System.IO.File]::ReadLines() para leer el archivo línea por línea y procesar cada línea utilizando un bucle foreach.
  • Incluimos manejo de errores para capturar cualquier excepción que pueda ocurrir durante la lectura del archivo.

Usar la clase System.IO.StreamReader en PowerShell para leer un archivo línea por línea

Para leer un archivo línea por línea en PowerShell utilizando la clase System.IO.StreamReader, sigue estos pasos:

  1. Especifica la ruta del archivo:

    Comienza especificando la ruta al archivo que deseas leer. Reemplaza "example.txt" con la ruta real a tu archivo.

    powershellCopy code
    $filePath = "example.txt"
    
  2. Verifica si el archivo existe:

    Antes de intentar leer el archivo, es una buena práctica verificar si el archivo existe utilizando el cmdlet Test-Path:

    powershellCopy codeif (Test-Path $filePath) {
        # File exists, proceed with reading
    } else {
        Write-Host "File not found: $filePath"
    }
    
  3. Leer el archivo línea por línea:

    Una vez que hayas verificado que el archivo existe, puedes usar la clase System.IO.StreamReader para leer el archivo línea por línea. Aquí está el código para hacerlo:

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: $_"
}

En este código:

  • Creamos una nueva instancia de System.IO.StreamReader usando [System.IO.StreamReader]::new($filePath), donde $filePath es la ruta al archivo.
  • Usamos un bucle while para leer el archivo línea por línea. La condición $reader.Peek() -ge 0 asegura que continuemos leyendo hasta que se alcance el final del archivo.
  • Dentro del bucle, usamos $reader.ReadLine() para leer cada línea y procesarla según sea necesario. En este ejemplo, simplemente estamos mostrando cada línea usando Write-Host, pero puedes realizar cualquier acción deseada.
  • Finalmente, cerramos el StreamReader usando $reader.Close() para liberar los recursos del archivo.

Ejemplo completo de código funcional

Aquí hay un ejemplo completo de código que lee un archivo línea por línea y muestra cada línea:

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"
}

En este código:

  • Especificamos la ruta al archivo utilizando la variable $filePath.
  • Verificamos si el archivo existe utilizando Test-Path.
  • Si el archivo existe, creamos una instancia de System.IO.StreamReader para leer el archivo línea por línea y procesar cada línea utilizando un bucle while.
  • Incluimos manejo de errores para capturar cualquier excepción que pueda ocurrir durante la lectura del archivo.

Conclusión

En resumen, PowerShell proporciona varios métodos versátiles para leer archivos línea por línea, atendiendo a diversas necesidades de scripting y automatización. Get-Content con un bucle ForEach es una opción fácil de usar para tareas sencillas, ofreciendo simplicidad y legibilidad. Get-Content con Foreach-Object mejora la flexibilidad, haciéndolo adecuado para operaciones más intrincadas y tareas de filtrado dentro de la canalización.

Para escenarios que requieren un mayor control y un manejo de errores completo, la clase [System.IO.File] ofrece una solución potente. Este método te permite afinar las operaciones con archivos y manejar excepciones de manera adecuada, haciéndolo adecuado para scripts robustos y resistentes a errores.

En situaciones donde estás tratando con archivos grandes y la eficiencia de la memoria es crucial, la clase System.IO.StreamReader brilla. Te permite leer archivos de manera eficiente mientras gestiona los recursos de memoria de manera más efectiva, asegurando un procesamiento fluido de grandes conjuntos de datos.

En última instancia, la elección del método depende de tus requisitos específicos del script, el tamaño del archivo y la complejidad del procesamiento. Al aprovechar estos métodos, puedes leer archivos línea por línea en PowerShell con confianza, abordando efectivamente una amplia gama de tareas relacionadas con archivos en tus flujos de trabajo de automatización.

¿Disfrutas de nuestros tutoriales? Suscríbete a DelftStack en YouTube para apoyarnos en la creación de más guías en vídeo de alta calidad. Suscríbete
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

Artículo relacionado - PowerShell File