ค้นหาเว็บไซต์

อ่านไฟล์ทีละบรรทัดใน PowerShell


เราสามารถใช้ PowerShell เพื่ออ่านไฟล์ทีละบรรทัด ไม่ว่าจะเป็นไฟล์ข้อความหรือไฟล์ CSV วิธีนี้ช่วยให้เราสามารถประมวลผลข้อมูลจากแต่ละบรรทัดในไฟล์แยกกันได้

หากต้องการอ่านไฟล์ เราใช้ Get-Content cmdlet ใน PowerShell cmdlet นี้จะส่งออกวัตถุ (เนื้อหา) ทีละรายการลงในไปป์ไลน์ แต่ถ้าคุณกำหนดให้กับตัวแปร เนื้อหาจะถูกเก็บไว้ในอาร์เรย์

ในบทความนี้ ฉันจะแสดงวิธีใช้ Get-Content cmdlet เพื่ออ่านไฟล์ทีละบรรทัดพร้อมตัวอย่างบางส่วน และให้คำแนะนำในการทำงานกับไฟล์ขนาดใหญ่

อ่านไฟล์ทีละบรรทัด

หากต้องการอ่านเนื้อหาของไฟล์ข้อความใน PowerShell คุณสามารถใช้ Get-Content cmdlet ตามค่าเริ่มต้น cmdlet นี้จะส่งคืนไฟล์ข้อความแต่ละบรรทัดเป็นสตริงแยกต่างหากไปยังไปป์ไลน์ ซึ่งหมายความว่าคุณสามารถประมวลผลแต่ละบรรทัดได้ทันทีหลังจากที่ PowerShell อ่านแล้ว

ตัวอย่างเช่น หากต้องการอ่านเนื้อหาของไฟล์ข้อความ “file1.txt” และแสดงแต่ละบรรทัดในคอนโซล เราสามารถทำได้:

Get-Content -path "C:\temp\File1.txt" | ForEach-Object {
    Write-Host "The content of this line is - $_"
}

อีกทางเลือกหนึ่งคือการกำหนดผลลัพธ์ให้กับตัวแปร ในกรณีนี้ แต่ละบรรทัดจะถูกจัดเก็บไว้ในอาร์เรย์เป็นสตริง เพื่อให้คุณสามารถวนซ้ำได้ในภายหลัง:

$file1 = Get-Content -path "C:\temp\File1.txt"

ForEach($line in $file1) {
    Write-Host $line
}

อย่างไรก็ตาม มีหมายเหตุสำคัญที่ต้องทำที่นี่ หากไฟล์มีข้อความเพียงบรรทัดเดียว เนื้อหาจะถูกจัดเก็บเป็นสตริง ไม่ใช่อาร์เรย์ ในสถานการณ์ส่วนใหญ่ สิ่งนี้จะไม่เป็นปัญหา แต่หากคุณต้องการได้รับบรรทัดแรกจากอาร์เรย์ คุณก็จะได้รับผลลัพธ์ที่ไม่คาดคิด:

$file1 = Get-Content -path "C:\temp\File1.txt"

# Return the first line:
Write-Host $file1[0]

# Result : Line 1: This is the first line of the file.

$file2 = Get-Content -path "C:\temp\File2.txt"
# Return the first line:
Write-Host $file2[0]

# Result : T

เพื่อป้องกันสิ่งนี้ เราสามารถใช้ตัวดำเนินการ array-subexpression ซึ่งช่วยให้มั่นใจว่าผลลัพธ์จะเป็นอาร์เรย์เสมอ:

$arrayFromFile = @(Get-Content -path "C:\temp\File2.txt")

# or cast an array:
[array]$arrayFromFile = @Get-Content -path "C:\temp\File2.txt"

การอ่านไฟล์ขนาดใหญ่

เมื่อคุณต้องการอ่านไฟล์ขนาดใหญ่ หรือเมื่อประสิทธิภาพโดยทั่วไปเป็นปัญหา ควรใช้วิธี direct .NET เพื่ออ่านไฟล์

สิ่งสำคัญที่ควรทราบก็คือ เมื่อคุณใช้วิธี .NET คุณควรใช้เส้นทางที่แน่นอนไปยังไฟล์ แทนที่จะเป็นเส้นทางสัมพัทธ์ เหตุผลก็คือ บางครั้งวิธี .NET ก็มีไดเร็กทอรีการทำงานที่แตกต่างจาก PowerShell

$arrayFromFileNET = [IO.File]::ReadAllLines("C:\temp\File2.txt")

ฉันได้ทำการทดสอบเพื่อวัดความแตกต่างระหว่างทั้งสองวิธีแล้ว และวิธี .NET นั้นเร็วกว่าวิธี Get-Content เกือบ 10 เท่า สำหรับการทดสอบ ฉันใช้ไฟล์บันทึกขนาด 13 MB และทำการทดสอบแต่ละครั้ง 5 ครั้งเพื่อให้ได้ค่าเฉลี่ยที่ดี

อ่านบรรทัดแรกหรือบรรทัดสุดท้ายเท่านั้น

บางครั้งคุณไม่จำเป็นต้องอ่านทุกบรรทัดของไฟล์ข้อความ แต่คุณอาจต้องการอ่านเพียงบรรทัดแรกหรือบรรทัดสุดท้ายของไฟล์เท่านั้น ในการดำเนินการนี้ เราสามารถใช้พารามิเตอร์ -First และ -Tail ของ Get-Content cmdlet

หากต้องการอ่านบรรทัดสุดท้ายของไฟล์ข้อความ:

Get-Content -Path "C:\temp\File1.txt" -Tail 1

และหากต้องการอ่านเฉพาะบรรทัดแรกคุณสามารถทำได้:

Get-Content -Path "C:\temp\File1.txt" -First 1

คุณสามารถเพิ่มจำนวนเพื่อให้ถึง n บรรทัดแรกหรือ n สุดท้ายของบรรทัดในไฟล์

ห่อขึ้น

ในกรณีส่วนใหญ่ Get-Content cmdlet เป็นตัวเลือกที่ดีที่สุดในการอ่านไฟล์ทีละบรรทัดใน PowerShell แต่เมื่อคุณต้องการประมวลผลไฟล์ขนาดใหญ่ การใช้วิธี .NET แทนก็คุ้มค่าอย่างแน่นอน มันเร็วกว่ามากเมื่อเทียบกับ PowerShell cmdlets

หวังว่าคุณจะชอบบทความนี้ อย่าลืมดาวน์โหลด PowerShell Cheat Sheet ฟรี และหากคุณมีคำถามใด ๆ เพียงแสดงความคิดเห็นด้านล่าง