Saya memiliki file yang dapat berisi 3 hingga 4 kolom nilai numerik yang dipisahkan oleh koma. Bidang kosong didefinisikan dengan pengecualian ketika mereka berada di akhir baris:
1,2,3,4,5
1,2,3,,5
1,2,3
Tabel berikut dibuat di MySQL:
+ ------- + -------- + ------ + ----- + --------- + ------- + | Bidang | Ketik | Null | Kunci | Default | Ekstra | + ------- + -------- + ------ + ----- + --------- + ------- + | satu | int (1) | YA | | NULL | | | dua | int (1) | YA | | NULL | | | tiga | int (1) | YA | | NULL | | | empat | int (1) | YA | | NULL | | | lima | int (1) | YA | | NULL | | + ------- + -------- + ------ + ----- + --------- + ------- +
Saya mencoba memuat data menggunakan perintah MySQL LOAD:
LOAD DATA INFILE '/tmp/testdata.txt' INTO TABLE moo FIELDS
TERMINATED BY "," LINES TERMINATED BY "\n";
Tabel yang dihasilkan:
+ ------ + ------ + ------- + ------ + ------ + | satu | dua | tiga | empat | lima | + ------ + ------ + ------- + ------ + ------ + | 1 | 2 | 3 | 4 | 5 | | 1 | 2 | 3 | 0 | 5 | | 1 | 2 | 3 | NULL | NULL | + ------ + ------ + ------- + ------ + ------ +
Masalahnya terletak pada kenyataan bahwa ketika suatu bidang kosong dalam data mentah dan tidak didefinisikan, MySQL untuk beberapa alasan tidak menggunakan nilai default kolom (yang NULL) dan menggunakan nol. NULL digunakan dengan benar ketika bidang tersebut hilang sama sekali.
Sayangnya, saya harus dapat membedakan antara NULL dan 0 pada tahap ini sehingga bantuan apa pun akan dihargai.
Terima kasih S.
sunting
Output dari MENUNJUKKAN PERINGATAN:
+ --------- + ------ + -------------------------------- ------------------------ + | Level | Kode | Pesan | + --------- + ------ + -------------------------------- ------------------------ + | Peringatan | 1366 | Nilai integer salah: '' untuk kolom 'empat' di baris 2 | | Peringatan | 1261 | Baris 3 tidak berisi data untuk semua kolom | | Peringatan | 1261 | Baris 3 tidak berisi data untuk semua kolom | + --------- + ------ + -------------------------------- ------------------------ +
mysql
csv
load-data-infile
Spiros
sumber
sumber
LOAD DATA
. Lihat bagian contoh SQL d6tstack tentang perubahan skema data.Jawaban:
Ini akan melakukan apa yang Anda inginkan. Itu membaca bidang keempat menjadi variabel lokal, dan kemudian menetapkan nilai bidang aktual ke NULL, jika variabel lokal akhirnya berisi string kosong:
Jika semuanya mungkin kosong, maka Anda akan membacanya semuanya menjadi variabel dan memiliki beberapa pernyataan SET, seperti ini:
sumber
''
ketika mereka mengunduh csv (menggunakanIFNULL(Col,'')
dalamSELECT INTO OUTFILE
kueri) untuk excel tetapi kemudian mengunggah menerimanya sebagai null vs harus berurusan dengan\N
di csv. Terima kasih!0
yang harus dikonversiNULL
(karena tidak mungkin memiliki nilai nol untuk data yang dimaksud) dan juga mengosongkan string. Bagaimana cara memastikan bahwa nol dan string kosong dikonversi keNULL
?nullif(@vone, 0)
.Manual MySQL mengatakan:
Jadi, Anda perlu mengganti yang kosong dengan \ N seperti ini:
sumber
Fields enclosed by: "
adalah bahwa"\N"
dari"name",\N,"stuff"
\N
diterima yang menunjukkanNULL
. Alih-alih gunakanNULL
, seperti dalam contoh ini:"name","age",NULL,"other","stuff"
Perilaku berbeda tergantung pada konfigurasi database. Dalam mode ketat ini akan menimbulkan kesalahan selain peringatan. Permintaan berikut dapat digunakan untuk mengidentifikasi konfigurasi basis data.
sumber
Memproses ulang CSV input Anda untuk mengganti entri kosong dengan \ N.
Coba di regex: s / ,, /, \ n, / g dan s /, $ /, \ N / g
Semoga berhasil.
sumber
(variable1, @ variable2, ..) SET variable2 = nullif (@ variable2, '' or '') >> Anda dapat meletakkan kondisi apa pun
sumber
tampilkan variabel
Show variables like "`secure_file_priv`";
Catatan: simpan file csv Anda di lokasi yang diberikan oleh perintah di atas.
Catatan: di sini kolom '
date
' memiliki beberapa nilai kosong di file csv.sumber