Eu quero ler um arquivo linha por linha no PowerShell. Especificamente, eu quero fazer um loop pelo arquivo, armazenar cada linha em uma variável do loop e fazer algum processamento na linha.
Eu sei o equivalente ao Bash:
while read line do
if [[ $line =~ $regex ]]; then
# work here
fi
done < file.txt
Não há muita documentação sobre os loops PowerShell.
Não há muita documentação sobre os loops PowerShell.
A documentação sobre loops no PowerShell é abundante, e você pode querer verificar os seguintes tópicos de ajuda: sobre_For
, sobre_ForEach
, sobre_Do
, sobre_Equando
.
foreach($line in Get-Content .\file.txt) {
if($line -match $regex){
# Work here
}
}
Outra solução idiomática PowerShell para o seu problema é canalizar as linhas do arquivo de texto para a ForEach-Object` cmdlet:
Get-Content .\file.txt | ForEach-Object {
if($_ -match $regex){
# Work here
}
}
Ao invés de regexar a correspondência dentro do loop, você poderia canalizar as linhas através de Where-Object` para filtrar apenas aquelas em que você'está interessado:
Get-Content .\file.txt | Where-Object {$_ -match $regex} | ForEach-Object {
# Work here
}
O Get-Content
tem má performance; ele tenta ler o arquivo na memória de uma só vez.
O leitor de ficheiros C# (.NET) lê cada linha uma a uma
**Melhor desempenho***
foreach($line in [System.IO.File]::ReadLines("C:\path\to\file.txt"))
{
$line
}
Ou um pouco menos performante
[System.IO.File]::ReadLines("C:\path\to\file.txt") | ForEach-Object {
$_
}
A declaração "para cada" será provavelmente um pouco mais rápida do que "Para cada objeto" (veja os comentários abaixo para mais informações).