Dapatkah saya menggunakan file batch untuk menghapus kolom kosong di .csv

3

Saya memiliki sembilan kolom di file .csv saya saat ini, namun, kolom ke-2 dan ke-3 kosong dan saya ingin menyingkirkannya. Apakah ada cara untuk menggunakan perintah batch untuk menghapus kolom kosong ini dari .csv saya atau mengekspor .csv baru tanpa kolom kosong itu?

batchnoober
sumber
2
Harap edit pertanyaan Anda untuk mengonfirmasi: (1) Apakah Anda menjalankan Windows? (2) Jika demikian, apakah Anda mencari solusi batch Windows murni, atau apakah Anda terbuka untuk alternatif lain?
Gord Thompson

Jawaban:

2

For /Fmampu mem-parsing file .csv. Dalam satu baris, dijalankan langsung dari command prompt:

for /F "tokens=1,2,3* delims=," %i in (input.csv) do @echo %i,%l>>output.csv

Ini melintasi baris input.csv untuk baris dan menggunakan koma sebagai pembatas, menyimpan nilai pertama di %i, kedua di %j, ketiga di %kdan sisa string (dengan menggunakan tanda bintang di daftar token) di %l. Dengan mencetak semua kecuali nilai kedua dan ketiga, Anda secara efektif mengeluarkannya.

Namun, for /Ftidak menghitung string kosong sebagai token, sehingga perintah tidak dapat membedakan antara dua koma berikutnya dan satu. Solusi ini berfungsi jika kolom kosong memiliki karakter spasi, tetapi dapat melewati kolom yang salah.

Untuk menghindari pembatasan ini, kita bisa menulis file batch yang menggunakan penggantian string untuk menyisipkan spasi antara dua koma berikutnya. Penggantian ini dilakukan dua kali untuk mengatasi kemungkinan tiga koma. Kutipan dalam ^"!line!^"diperlukan untuk menunjukkan for /Fharus beroperasi pada string, bukan file dan melarikan diri untuk mencegah !line!dievaluasi sebagai string literal, bukan variabel.

@echo off
setlocal EnableDelayedExpansion
for /F "delims=" %%a in (input.csv) do (
    set line=%%a
    set line=!line:,,=, ,!
    set line=!line:,,=, ,!
    for /F "tokens=1,2,3* delims=," %%i in (^"!line!^") do (
        echo %%i,%%l>>output.csv
    )
)

Hasilnya adalah file .csv baru, identik dengan input.csv, kecuali untuk kolom kedua dan ketiga yang dihilangkan.

Marcks Thomas
sumber
Perhatikan bahwa ini akan menambah kosong ke bidang kosong di kolom selain 2 dan 3. Misalnya, The,quick,brown,fox,,,the,lazy,dogakan menjadi The,,,fox, , ,the,lazy,dog.
Scott
3

Anda tidak menentukan OS mana. Jika milik Anda datang cut, gunakan ini.

cut -d',' -f1,4-9

-dset pembatas, dalam hal ini menjadi a ,. Karena koma bukan karakter khusus, Anda dapat menghilangkan tanda kutip.
-fmemilih bidang, dalam hal ini bidang 1 dan bidang 4 hingga 9 (melewatkan bidang 2 dan 3).

Testfile "example.cvs"
foo1,,, ba1, baz1, blah1, wibble1, wubble1
foo2,,, ba2, baz2, blah2, wibble2, wubble2
foo2,,, ba3,, blah3, wibble3, wubble3
foo2,,, ba4, baz4, blah4, wibble4, wubble4

Tes sebenarnya dari perintah:

> cut -d ',' -f1,4-9 example.cvs

foo1, ba1, baz1, blah1, wibble1, wubble1
foo2, ba2, baz2, blah2, wibble2, wubble2
foo2, ba3,, blah3, wibble3, wubble3
foo2, ba4, baz4, blah4, wibble4, wubble4

Cut sudah diinstal sebelumnya dengan sebagian besar sistem operasi (misalnya, OS / X, distribusi Linux, BSD, Solaris, ...; hampir semua orang kecuali DOS dan Windows).

Jika Anda memiliki Windows, Anda dapat:

  1. Buka file CVS dalam spreadsheet (mis., OpenOffice Calc atau MS Excel), hapus dua kolom, lalu simpan file tersebut. Sulit untuk diotomatisasi, jadi gunakan hanya jika Anda perlu melakukannya sekali atau jarang.
  2. atau unduh alat Unix untuk Windows dan masukkan cutperintah dalam file batch.
Hennes
sumber
OS saya adalah Windows. Sayangnya, saya ingin ini sebagai proses otomatis karena ini adalah .csv yang dibuat setiap hari dalam format yang sama. Apakah ada alternatif lain untuk OS windows?
batchnoober
Anda dapat menginstal perintah cut (mis. Dari gnuwin32.sourceforge.net/packages/coreutils.htm ), atau Anda dapat mencoba sesuatu dengan. Contoh penggunaan untuk adalahfor /f "tokens=5 delims= " %i in (file.txt) DO echo %i
Hennes
Kecuali Anda tahu jumlah kolom maksimum, gunakan -f1,4-untuk memasukkan semua kolom setelah kolom ketiga. 4-berarti 4-∞.
Scott
Benar. Saya mendasarkan saya -f4-9pada kalimat pertama dari posting OP "Saya punya sembilan kolom", tetapi -f4-lebih fleksibel kurang mengetik. Opsi lain akan digunakan sed.
Hennes
0

Saya akan membuka file CSV di Notepad (atau editor teks apa pun) dan mencari dan menggantinya ,,dengan ,. Ini, tentu saja, dengan asumsi data di kolom Anda tidak ada ,,di dalamnya.

kobaltz
sumber
3
Itu akan merusak struktur file jika ada kolom lain yang memiliki nilai kosong.
Gord Thompson
0

Dengan asumsi Anda menggunakan Windows, file tidak memiliki header, dan Anda memiliki Powershell tersedia untuk Anda, Anda dapat menggunakan sesuatu seperti berikut:

Import-Csv. \ InFile.csv -Header col1, col2, col3, col4, col5 -Pengganti ',' | Select-Object col1, col4, col5 | ConvertTo-Csv | Pilih -skip 2>. \ OutFile.csv

Sehingga:

  • Mengimpor CSV.
  • Tetapkan nama kolom untuk referensi.
  • Pilih semua 5 kolom, kecuali 2 dan 3.
  • Konversi kembali ke CSV yang tepat.
  • Memilih CSV itu, mulai dari baris 2 (untuk melewati tajuk kolom yang ditugaskan)
  • Pipihkan ke file output.
Ƭᴇcʜιᴇ007
sumber