อ่านไฟล์ทีละบรรทัดใน 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
ห่อขึ้น
ในกรณีส่วนใหญ่ Get-Content cmdlet เป็นตัวเลือกที่ดีที่สุดในการอ่านไฟล์ทีละบรรทัดใน PowerShell แต่เมื่อคุณต้องการประมวลผลไฟล์ขนาดใหญ่ การใช้วิธี .NET แทนก็คุ้มค่าอย่างแน่นอน มันเร็วกว่ามากเมื่อเทียบกับ PowerShell cmdlets
หวังว่าคุณจะชอบบทความนี้ อย่าลืมดาวน์โหลด PowerShell Cheat Sheet ฟรี และหากคุณมีคำถามใด ๆ เพียงแสดงความคิดเห็นด้านล่าง

