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

ข้อมูลพื้นฐานเกี่ยวกับ PowerShell: การนำทางไฟล์ CSV


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

ในการกำหนดขั้นตอน เรามาสร้างไฟล์ CSV แบบง่ายๆ เพื่อใช้ทำงานกันดีกว่า

@(
	[pscustomobject]@{
		FirstName = 'Joe'
		LastName = 'Jones,Barrett'
		Address = '453 1st St'
		City = 'Phoenix'
		State = 'AZ'
	},
	[pscustomobject]@{
		FirstName = 'Jose'
		LastName = 'Melindez'
		Address = '5663 Main St'
		City = 'Atlanta'
		State = 'GA'
	}
) | Export-Csv -Path ~Employees.csv

และอ่านด้วย Get-Content

Get-Content -Path ~Employees.csv

ไม่มีอะไรพิเศษเกินไป มีเพียงไฟล์ CSV ที่มีพนักงานสมมติสองคน บางสิ่งที่ควรทราบซึ่งจะมีประโยชน์ในภายหลัง สังเกตว่าไฟล์ CSV นี้ใช้เครื่องหมายจุลภาคเป็นตัวคั่นฟิลด์และเครื่องหมายคำพูด เครื่องหมายคำพูดล้อมรอบค่าฟิลด์แต่ละค่า ดังนั้น คุณสามารถใช้ตัวคั่น ซึ่งในกรณีนี้คือลูกน้ำ ภายในค่าฟิลด์ เช่น ตัวอย่าง "Jones-Barrett " นั่นคือฟิลด์เดียว

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

Get-Content -Path ~Employees.csv | Get-Member

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

,(Get-Content -Path ~Employees.csv) | Get-Member

คุณจะเห็นว่า Get-Content ส่งคืนอาร์เรย์ของอ็อบเจ็กต์ซึ่งในกรณีนี้คือสตริง เป็นอาร์เรย์เนื่องจากวงเล็บซ้ายและขวา

หากฉันดูที่วัตถุชิ้นเดียว คุณจะเห็นว่ามันเป็นเพียงบรรทัดทั้งหมดของไฟล์ CSV รวมถึงเครื่องหมายจุลภาคและเครื่องหมายคำพูดด้วย

Get-Content -Path ~/Employees.csv | Select-Object -First 1

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

Import-Csv -Path ~/Employees.csv

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

Import-Csv -Path ~/Employees.csv | Get-Member

ตอนนี้คุณสามารถเห็นได้ว่าประเภทออบเจ็กต์เอาต์พุตคือ System.Management.Automation.PSCustomObject; ไม่ใช่แค่เชือก Import-Csv cmdlet รู้โครงสร้างของไฟล์ CSV และสามารถแปลงเป็นชุด PSCustomObjects ได้

นี่คือไฟล์ CSV อีกประเภทหนึ่งที่คุณอาจพบ

Get-Content -Path ~Employees-withcommasnoquotes.csv

สังเกตเห็นความแตกต่าง? ไม่มีเครื่องหมายคำพูด และสังเกตแถวที่สอง Jones,Barrett ลูกน้ำนั้นเป็นส่วนหนึ่งของชื่อของโจจริงๆ ค่า Barrett ไม่ใช่ที่อยู่ของเขา

โปรดทราบ: ฉันสร้างไฟล์ CSV นั้นด้วยรหัสนี้:

@(
	[pscustomobject]@{
		FirstName = 'Joe'
		LastName = 'Jones,Barrett'
		Address = '453 1st St'
		City = 'Phoenix'
		State = 'AZ'
	},
	[pscustomobject]@{
		FirstName = 'Jose'
		LastName = 'Melindez'
		Address = '5663 Main St'
		City = 'Atlanta'
		State = 'GA'
	}
) | Export-Csv -Path ~Employees.csv

(Get-Content -Path ~Employees.csv).replace('"','') | Set-Content -Path ~Employees-withcommasnoquotes.csv

มาดูกันว่า Import-Csv จัดการเรื่องนี้อย่างไร

Import-Csv -Path ~Employees-withcommasnoquotes.csv

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

มาเปลี่ยนเกียร์กันดีกว่า ตอนนี้พูดถึงสถานการณ์หนึ่งที่คุณอาจพบว่าตัวเองเผชิญอยู่ อย่าลืมว่าฉันเคยกล่าวไว้ก่อนหน้านี้ว่า CSV ควรในทางเทคนิคมีช่องที่คั่นด้วยเครื่องหมายจุลภาค บางครั้งคุณจะพบไฟล์ “CSV ” ที่มีตัวคั่นต่างกันเช่นแท็บ ตามค่าเริ่มต้น Import-Csv cmdlet ไม่ชอบสิ่งนั้น

ตัวอย่างเช่น ฉันมีไฟล์ CSV ที่นี่...

Import-Csv ~/Employeeswithtabs.csv

สิ่งต่าง ๆ ดูไม่ถูกต้อง Import-Csv ไม่ได้แปลงแต่ละบรรทัดให้เป็นวัตถุ นั่นเป็นเพราะมันกำลังมองหาลูกน้ำเป็นตัวคั่นฟิลด์ ถ้าฉันดูไฟล์นี้…

Get-Content ~/Employeeswithtabs.csv

คุณจะเห็นช่องต่างๆ คั่นด้วยแท็บ ไม่ใช่ลูกน้ำ โชคดีที่มีวิธีแก้ไขด่วน เพียงใช้พารามิเตอร์ ตัวคั่น

Import-Csv ~/Employeeswithtabs.csv -Delimiter "`t"

ตอนนี้ผลผลิตดูดีขึ้นมาก ขณะนี้ Import-Csv กำลังมองหาแท็บที่เป็นตัวคั่นฟิลด์ แทนที่จะเป็นลูกน้ำ และกำลังแยกวิเคราะห์ไฟล์ CSV อย่างถูกต้อง

เพื่อสรุปการสาธิตนี้ ตอนนี้เราจะพูดถึงอีกหนึ่งสถานการณ์ CSV ที่ไม่มีส่วนหัว บางทีคุณอาจได้รับไฟล์ CSV จากฐานข้อมูล HR โบราณบางแห่งโดยไม่มีส่วนหัวที่มีลักษณะเช่นนี้

Get-Content -Path ~Employees-noheaders.csv

เมื่อคุณพยายามอ่าน CSV ด้วย Import-Csv นี่คือสิ่งที่เกิดขึ้น

Import-Csv -Path ~Employees-noheaders.csv

Import-Csv ไม่มีชื่อฟิลด์ที่จะเชื่อมโยงกับค่า ดังนั้นจึงใช้แถวบนสุดเป็นส่วนหัวและทำให้เป็นชื่อคุณสมบัติ นี่ไม่ถูกต้อง คุณสามารถแก้ไข CSV และเพิ่มส่วนหัวด้วยวิธีดังกล่าวได้ แต่ฉันมักชอบที่จะปล่อยให้ไฟล์ไม่เปลี่ยนแปลงมากที่สุด เพื่อให้ Import-Csv มีส่วนหัวที่ถูกต้อง ให้ใช้พารามิเตอร์ Header

Import-Csv -Path ~Employees-noheaders.csv -Header 'FirstName','LastName','Address','City','State'

ดีขึ้นมาก! เมื่อคุณใช้พารามิเตอร์ Header และระบุรายการที่คั่นด้วยเครื่องหมายจุลภาค Import-Csv จะใช้ชุดของค่าจากซ้ายไปขวาเป็นชื่อฟิลด์ แทนที่จะเป็นแถวแรกของ ไฟล์ CSV พารามิเตอร์นี้อนุญาตให้คุณแยกวิเคราะห์ไฟล์ CSV โดยไม่มีส่วนหัวโดยไม่ต้องแก้ไขไฟล์ต้นฉบับ

ตอนนี้คุณน่าจะได้รับประสบการณ์ที่ดีขึ้นในการอ่านไฟล์ CSV ด้วย PowerShell!

บทความที่เกี่ยวข้อง