memerlukan skrip Windows untuk menghapus kolom tertentu dari file csv

Saya memiliki file CSV (format disediakan di bawah) dengan pembatas disetel ke , . Sebagai keluaran, kami ingin menghapus column 4 ( Values ) dari CSV di bawah.

Kami membutuhkannya hanya dalam skrip batch WINDOWS karena tidak ada pengaturan skrip lain yang diizinkan di server. Server juga memiliki powershell tetapi kami tidak yakin bagaimana menggunakan perintah PowerShell untuk memenuhi tujuan di bawah ini.

CSVnya seperti di bawah ini:

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

Kami mencoba ini tetapi tidak berfungsi seperti yang diharapkan:

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

Hasil yang Diharapkan (menghapus kolom Nilai)

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

person Vicky    schedule 06.05.2019    source sumber
comment
Pertama-tama, jelaskan apa yang Anda perlukan -- jika Anda memerlukan bantuan dalam upaya pengkodean PowerShell, berikan contoh minimal yang dapat direproduksi (karena tidak berfungsi seperti yang diharapkan bukan merupakan deskripsi kesalahan, jadi harap jelaskan) dan terapkan tag powershell terkait. Jika Anda memerlukan file batch gratis, Anda salah di sini karena situs ini bukan layanan skrip gratis; maka ikuti tur dan lihat Cara Tanyakan! Jika Anda telah mencoba file batch dan pendekatan PowerShell, posting satu pertanyaan spesifik dengan contoh minimal yang dapat direproduksi per bahasa pengkodean!   -  person aschipfl    schedule 06.05.2019


Jawaban (3)


Daripada mencoba meretas dan mengikis CSV Anda sebagai teks datar, jauh lebih mudah untuk mengobjektifikasinya, lalu pilih properti yang ingin Anda pertahankan.

tes.csv:

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

tes.ps1:

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

hasil:

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

Jika sumber CSV Anda berasal dari pipeline dan bukan dari file, gunakan ConvertFrom-CSV sebagai gantinya.

person rojo    schedule 06.05.2019

Jika Anda menggunakan fungsionalitas CSV bawaan Import-CSV, Anda dapat mengecualikan properti/kolom, menggunakan -ExcludeProperty Select-Object.

Dari perintah atau skrip powershell:

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

Dari cmd atau batch-file:

PowerShell -NoP "IpCSV .\testCSV.csv|Select * -Exc Values|EpCSV .\Modified.csv -NoT"
person Compo    schedule 06.05.2019
comment
Alias ​​untuk -NoTypeInformation adalah -NTI menurut dokumen MSFT. Juga, +1. Saya menyukai solusi -ExcludeProperty Anda lebih baik daripada jawaban saya sendiri. - person rojo; 06.05.2019
comment
Saya mengetahui aliasnya, @rojo, dan meskipun pemendekan NoTypeInformation saya saat ini dapat berubah pada parameter di masa mendatang, saya lebih suka menggunakannya dalam pengetikan saya. Saya lebih dari puas, jika OP memerlukannya, mereka mengganti NoT dengan NTI seperti yang Anda komentari. - 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

Anda perlu mengubah pengaturan sourcedir dan destdir agar sesuai dengan keadaan Anda.

Saya menggunakan file bernama q56003792.txt yang berisi data Anda untuk pengujian saya.

Menghasilkan file yang didefinisikan sebagai %outfile%

Opsi usebackq hanya diperlukan karena saya memilih untuk menambahkan tanda kutip di sekitar nama file sumber.

Karena semua baris data Anda berisi kolom yang dipisahkan oleh , Saya akan menyarankan solusi batch murni ini.

Pembukaan menetapkan direktori dan nama file yang akan digunakan. Ini disesuaikan untuk sistem saya.

Inti utama dari rutin adalah for/f yang memanggil subrutin drop4 yang menyediakan setiap baris teks secara keseluruhan. for diapit tanda kurung untuk mengarahkan seluruh keluaran rutin ke file yang ditentukan.

Subrutin hanya menetapkan parameter ke variabel lingkungan standar (karena substring batch hanya dapat diterapkan ke variabel normal).

Baris call echo mengeksekusi echo setelah mengganti parameter yang disediakan %1..%4 sehingga string echoed akan menjadi baris asli, dengan semua karakter hingga [4 parameter pertama, dipisahkan oleh ,] diganti dengan [3 parameter pertama, dipisahkan oleh ,] - menjatuhkan kolom4.

person Magoo    schedule 06.05.2019