Quiero leer un archivo línea por línea en PowerShell. Específicamente, quiero hacer un bucle a través del archivo, almacenar cada línea en una variable en el bucle, y hacer algún procesamiento en la línea.
Conozco el equivalente en Bash:
while read line do
if [[ $line =~ $regex ]]; then
# work here
fi
done < file.txt
No hay mucha documentación sobre los bucles de PowerShell.
No hay mucha documentación sobre los bucles de PowerShell.
La documentación sobre los bucles en PowerShell es abundante, y es posible que quieras consultar los siguientes temas de ayuda: about_For
, about_ForEach
, about_Do
, about_While
.
foreach($line in Get-Content .\file.txt) {
if($line -match $regex){
# Work here
}
}
Otra solución idiomática de PowerShell para tu problema es canalizar las líneas del archivo de texto al cmdlet ForEach-Object
:
Get-Content .\file.txt | ForEach-Object {
if($_ -match $regex){
# Work here
}
}
En lugar de hacer coincidir regex dentro del bucle, podría canalizar las líneas a través de Where-Object
para filtrar sólo aquellas que le interesen:
Get-Content .\file.txt | Where-Object {$_ -match $regex} | ForEach-Object {
# Work here
}
Get-Content
tiene un mal rendimiento; intenta leer el archivo en memoria de una sola vez.
El lector de archivos de C# (.NET) lee cada línea una por una
El mejor rendimiento
foreach($line in [System.IO.File]::ReadLines("C:\path\to\file.txt"))
{
$line
}
O un poco menos de rendimiento
[System.IO.File]::ReadLines("C:\path\to\file.txt") | ForEach-Object {
$_
}
La sentencia foreach
será probablemente un poco más rápida que ForEach-Object
(ver comentarios más abajo para más información).