PowerShell'de Dosya Satır Satır Nasıl Okunur?


PowerShell'de yakın zamanda bir metin dosyasını satır satır okuma gereksinimi duydum. Bunu yapmanın çeşitli yöntemleri vardır. Bu PowerShell eğitiminde, PowerShell kullanarak bir dosyayı satır satır okumak için çeşitli yöntemleri örneklerle ve tam komut dosyalarıyla açıklayacağım.

PowerShell'de bir dosyayı satır satır okumak için, dosya içeriğini okuyan ve her satırda yinelenen bir foreach döngüsüyle birleştirilmiş Get-Content cmdlet'ini kullanabilirsiniz. Büyük dosyalar için, dosyanın tamamını belleğe yüklemeden satırları sırayla okumak ve böylece sistem kaynaklarını korumak için [System.IO.File]::ReadLines yöntemini veya bir [System.IO.StreamReader] nesnesini kullanmayı düşünün. Get-Content'in kullanıldığı kısa bir örneği burada bulabilirsiniz:

Get-Content -Path "C:\MyFolder\file.txt" | foreach { Write-Output $_ }

Yöntem-1: Get-Content ve Foreach Döngüsünü Kullanma

PowerShell'de bir dosyayı satır satır okumanın en kolay yolu Get-Content cmdlet'ini foreach döngüsüyle birlikte kullanmaktır.

PowerShell Get-Content cmdlet'i bir dosyanın içeriğini okur ve varsayılan olarak satır satır döndürür.

İşte basit bir örnek:

$fileContent = Get-Content -Path "C:\MyFolder\file.txt"
foreach ($line in $fileContent) {
    # Process each line
    Write-Output $line
}

Bu komut dosyasında, Get-Content, file.txt dosyasının her satırını alır ve bunu $fileContent değişkeninde saklar. Daha sonra foreach döngüsü her satır üzerinde yinelenir ve Write-Output bunu konsolda görüntüler.

PowerShell betiğini çalıştırdıktan sonra çıktıyı aşağıdaki ekran görüntüsündeki gibi görebilirsiniz:

Yöntem-2: Dosya İçeriğinin Akışı

PowerShell'de büyük dosyalarla çalışıyorsanız dosyanın tamamının belleğe yüklenmesini önlemek için dosya içeriğini akışa almak isteyebilirsiniz. Bu, Get-Content çıktısını doğrudan bir foreach döngüsüne aktararak yapılabilir:

Get-Content -Path "C:\MyFolder\largefile.txt" -Stream | foreach {
    # Process each line
    Write-Output $_
}

Burada $_, işlem hattındaki geçerli satırı temsil eder ve dosya içeriğinin tamamını bir değişkende saklamadan doğrudan onunla çalışmanıza olanak tanır.

Yöntem 3: ForEach-Object Cmdlet'ini Kullanma

Başka bir yaklaşım, Get-Content çıktısının doğrudan ForEach-Object'e aktarılmasını içerir; bu, PowerShell'de işlem hattındaki her satırı işlemenize olanak tanır:

Get-Content -Path "C:\MyFolder\file.txt" | ForEach-Object {
    # Process each line
    Write-Host $_
}

Bu örnekte $_, işlenmekte olan geçerli satır olan boru hattındaki geçerli nesneyi temsil eder.

İşte çıktı:

Yöntem 4: [System.IO.File]::ReadLines()'ı kullanma

Büyük dosyalar için, dosyayı tembel bir şekilde okuyan [System.IO.File]::ReadLines() yöntemini kullanmak daha verimlidir; bu, bellekteki satırları yalnızca ihtiyaç duyuldukça okuduğu anlamına gelir.

Örnek :

[System.IO.File]::ReadLines("C:\path\to\your\file.txt") | ForEach-Object {
    # Process each line
    Write-Host $_
}

Bu yöntem özellikle çok büyük dosyaların çok fazla bellek tüketmeden işlenmesi için kullanışlıdır.

Yöntem 5: Akış Okuyucusunu Kullanma

Dosya okuma süreci üzerinde daha fazla kontrole ihtiyacınız varsa PowerShell'de bir StreamReader nesnesi kullanabilirsiniz. Bu aynı zamanda büyük dosyalar için de iyi bir seçenektir.

Örnek :

$streamReader = [System.IO.StreamReader] "C:\MyFolder\file.txt"
try {
    while ($streamReader.Peek() -ge 0) {
        $line = $streamReader.ReadLine()
        # Process each line
        Write-Host $line
    }
}
finally {
    $streamReader.Close()
}

Bu komut dosyası, dosya için bir StreamReader nesnesi oluşturur ve okunacak satır kalmayıncaya kadar while döngüsündeki her satırı okur. Kaynakları boşaltmak için işlem tamamlandığında StreamReader'ı Close() yöntemiyle kapatmak önemlidir.

Yöntem 6: Switch İfadesini Kullanma

PowerShell'in switch ifadesi bir dosyayı satır satır okumak için de kullanılabilir.

İşte basit bir Örnek:

switch -File "C:\MyFolder\file.txt" {
    default {
        # Process each line
        Write-Host $_
    }
}

switch ifadesi dosyayı okur ve geçerli satıra referans vermek için $_ kullanarak her satırı ilerler.

Gerçek Örnek

İşte bir günlük dosyasını okuyan ve PowerShell'de "Hata" kelimesini içeren satırları çıkaran eksiksiz bir komut dosyası:

$logFilePath = "C:\MyFolder\log.txt"
$errorLines = @()

Get-Content -Path $logFilePath | ForEach-Object {
    if ($_ -match "Error") {
        $errorLines += $_
    }
}

# Output error lines to a new file
$errorLogPath = "C:\NewFolder\error_log.txt"
$errorLines | Out-File -FilePath $errorLogPath

Write-Host "Error lines extracted to $errorLogPath"

Bu komut dosyası bir günlük dosyasını okur, "Hata" içeren satırları filtreler ve bu satırları yeni bir hata günlük dosyasına yazar.

Çözüm

PowerShell'de bir dosyayı satır satır okumak birkaç yöntem kullanılarak gerçekleştirilebilir:

  • Get-Content ve Foreach Döngüsünü Kullanma
  • Dosya İçeriği Akışı
  • ForEach-Object Cmdlet'ini Kullanma
  • [System.IO.File]::ReadLines()'ı kullanma
  • Akış Okuyucusunu Kullanma
  • Switch İfadesini Kullanma

İster küçük ister büyük dosyaları işliyor olun, PowerShell size PowerShell'de bir dosyayı satır satır okumanın farklı yollarını sunar.

İlgili makaleler