ต้องการสคริปต์ windows เพื่อลบคอลัมน์ใดคอลัมน์หนึ่งออกจากไฟล์ csv

ฉันมีไฟล์ CSV (รูปแบบที่ให้ไว้ด้านล่าง) โดยตั้งค่าตัวคั่นเป็น , เพื่อเป็นผลลัพธ์ เราต้องการลบ column 4 ( Values ) ออกจาก CSV ที่ต่ำกว่า

เราต้องการมันในแบตช์สคริปต์ของ WINDOWS เท่านั้น เนื่องจากไม่อนุญาตให้ตั้งค่าสคริปต์อื่นบนเซิร์ฟเวอร์ เซิร์ฟเวอร์มี powershell เช่นกัน แต่เราไม่แน่ใจว่าจะใช้คำสั่ง PowerShell เพื่อให้บริการตามจุดประสงค์ด้านล่างได้อย่างไร

CSV มีดังต่อไปนี้:

ID, NAME, SR, Values, Status  
"1", "Raj", "123", "A,B,C,D,E", "False"    
"2", "Rahul", "456", "C", "False" 

เราลองสิ่งนี้แล้ว แต่มันไม่ทำงานตามที่คาดไว้:

(Get-Content .\testCSV.csv) | Foreach-Object { $_.split()[4] -join ' ' } | Out-File .\file.txt

ผลลัพธ์ที่คาดหวัง ( ลบคอลัมน์ค่า )

ID, NAME, SR, Status
"1", "Raj", "123", "False"
"2", "Rahul", "456" , "False"

person Vicky    schedule 06.05.2019    source แหล่งที่มา
comment
ขั้นแรก ให้ชี้แจงสิ่งที่คุณต้องการ หากคุณต้องการความช่วยเหลือในการเขียนโค้ด PowerShell โปรดระบุ ตัวอย่างที่ทำซ้ำได้น้อยที่สุด (เนื่องจากมันไม่ทำงานตามที่คาดไว้ จึงไม่ใช่คำอธิบายข้อผิดพลาด ดังนั้นโปรดอธิบายอย่างละเอียด) และใช้แท็ก powershell ที่เกี่ยวข้อง หากคุณต้องการไฟล์แบตช์ฟรี คุณคิดผิดเพราะไซต์นี้ไม่ใช่บริการเขียนสคริปต์ฟรี โปรดเข้าร่วมทัวร์ชมและศึกษาวิธีการ ถาม! ในกรณีที่คุณได้ลองใช้ทั้งไฟล์แบตช์และวิธีการ PowerShell แล้ว ให้โพสต์คำถามเฉพาะเจาะจงหนึ่งคำถามพร้อมตัวอย่างที่ทำซ้ำได้น้อยที่สุด ต่อ ภาษาเข้ารหัส!   -  person aschipfl    schedule 06.05.2019


คำตอบ (3)


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

test.csv:

ID, NAME, SR, Values, Status  
"1", "Raj", "123", "A,B,C,D,E", "False"    
"2", "Rahul", "456", "C", "False"

test.ps1:

ipcsv test.csv | select ID,NAME,SR,Values | export-csv test2.csv -NTI

ผลลัพธ์:

"ID","NAME","SR","Values"
"1","Raj","123","A,B,C,D,E"
"2","Rahul","456","C"

หากแหล่งที่มา CSV ของคุณมาจากไปป์ไลน์แทนที่จะมาจากไฟล์ ให้ใช้ ConvertFrom-CSV แทน

person rojo    schedule 06.05.2019

หากคุณใช้ฟังก์ชัน CSV ในตัวของ Import-CSV คุณสามารถยกเว้นคุณสมบัติ/คอลัมน์ได้ โดยใช้ Select-Object's -ExcludeProperty

จากพรอมต์หรือสคริปต์ powershell:

Import-CSV .\testCSV.csv | Select-Object * -ExcludeProperty Values | Export-CSV .\Modified.csv -NoTypeInformation

จาก cmd หรือ batch-file:

PowerShell -NoP "IpCSV .\testCSV.csv|Select * -Exc Values|EpCSV .\Modified.csv -NoT"
person Compo    schedule 06.05.2019
comment
นามแฝงสำหรับ -NoTypeInformation คือ -NTI ตาม เอกสาร MSFT +1 ด้วยครับ ฉันชอบโซลูชัน -ExcludeProperty ของคุณมากกว่าคำตอบของฉันเอง - person rojo; 06.05.2019
comment
ฉันทราบถึงนามแฝง @rojo และในขณะที่การย่อ NoTypeInformation ของฉันในปัจจุบันอาจมีการเปลี่ยนแปลงพารามิเตอร์ในอนาคต ฉันชอบที่จะใช้มันในการพิมพ์ของฉัน ฉันพอใจมากหาก OP ต้องการโดยแทนที่ NoT ด้วย NTI ตามที่คุณแสดงความคิดเห็น - person Compo; 06.05.2019

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
SET "filename1=%sourcedir%\q56003792.txt"
SET "outfile=%destdir%\outfile.txt"
(
FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO CALL :drop4 %%a
)>"%outfile%"

GOTO :EOF

:drop4
:: all data to 'line'
SET "line=%*"
CALL ECHO %%line:*%1, %2, %3, %4, =%1, %2, %3, %%
GOTO :eof

คุณจะต้องเปลี่ยนการตั้งค่าของ sourcedir และ destdir เพื่อให้เหมาะกับสถานการณ์ของคุณ

ฉันใช้ไฟล์ชื่อ q56003792.txt ที่มีข้อมูลของคุณสำหรับการทดสอบ

สร้างไฟล์ที่กำหนดเป็น %outfile%

จำเป็นต้องใช้ตัวเลือก usebackq เท่านั้นเนื่องจากฉันเลือกที่จะเพิ่มเครื่องหมายคำพูดรอบชื่อไฟล์ต้นฉบับ

เนื่องจากบรรทัดข้อมูลทั้งหมดของคุณมีคอลัมน์คั่นด้วย , ฉันจะแนะนำโซลูชันแบบแบตช์เดียวนี้

คำนำสร้างไดเร็กทอรีและชื่อไฟล์ที่จะใช้ สิ่งเหล่านี้ถูกปรับแต่งสำหรับระบบของฉัน

เนื้อหลักของรูทีนคือ for/f ซึ่งเรียกรูทีนย่อย drop4 ที่ให้แต่ละบรรทัดข้อความทั้งหมดคำต่อคำ for อยู่ในวงเล็บเพื่อเปลี่ยนเส้นทางเอาต์พุตรูทีนทั้งหมดไปยังไฟล์ที่ระบุ

รูทีนย่อยเพียงกำหนดพารามิเตอร์ให้กับตัวแปรสภาพแวดล้อมมาตรฐาน (เนื่องจากการสตริงย่อยแบบแบตช์สามารถใช้ได้กับตัวแปรปกติเท่านั้น)

บรรทัด call echo ดำเนินการ echo โดยแทนที่พารามิเตอร์ที่ให้มา %1..%4 ดังนั้นสตริง echoed จะเป็นบรรทัดดั้งเดิม โดยมีอักขระทั้งหมดจนถึง [พารามิเตอร์ 4 ตัวแรก คั่นด้วย ,] ถูกแทนที่ด้วย [พารามิเตอร์ 3 ตัวแรก คั่นด้วย โดย ,] - วางคอลัมน์ 4

person Magoo    schedule 06.05.2019