2013-06-11 8 views
7

Bir MySQL veritabanına yüklemem gereken bir dizi CSV verisi var. Şey, CSV-ish, belki de. (düzenleme: actually, it looks like the stuff described in RFC 4180)ÇOK VERİ DOSYASI çift tırnaklı karakterin kaçış karakteri olarak kullanıldığı yerlerde

Her satır, virgülle ayrılmış çift dizili dizelerin listesidir. Bir sütun değeri içinde görünen herhangi bir çift tırnaktan kaçmak için çift çift tırnak kullanılır. Ters eğik çizgi kendilerini temsil etmesine izin verilir. Örneğin

, satır: JSON ayrıştırılır eğer

"", "\wave\", ""hello,"" said the vicar", "what are ""scare-quotes"" good for?", "I'm reading ""Bossypants""" 

olmalıdır:

[ "", "\\wave\\", "\"hello,\" said the vicar", "what are \"scare-quotes\" good for?", "I'm reading \"Bossypants\"" ] 

ı CSV okumayı LOAD DATA kullanmaya çalışıyorum, ama ben koşuyorum bazı tuhaf davranışlar içine. Örnek olarak


, benim girdi dosyasının olmayan ilk başlık satırı "" üzerinde sona ererse ben basit iki sütun tablo

shell% mysql exampledb -e "describe person" 
+-------+-----------+------+-----+---------+-------+ 
| Field | Type  | Null | Key | Default | Extra | 
+-------+-----------+------+-----+---------+-------+ 
| ID | int(11) | YES |  | NULL |  | 
| UID | char(255) | YES |  | NULL |  | 
+-------+-----------+------+-----+---------+-------+ 
shell% 

varsa düşünün:

shell% cat temp-1.csv 
"ID","UID" 
"9","" 
"0","Steve the Pirate" 
"1","\Alpha" 
"2","Hoban ""Wash"" Washburne" 
"3","Pastor Veal" 
"4","Tucker" 
"10","" 
"5","Simon" 
"6","Sonny" 
"7","Wat\" 

ben her başlık olmayan satırı yükleyebilir veya ilk:

mysql> DELETE FROM person; 
Query OK, 0 rows affected (0.00 sec) 

mysql> LOAD DATA 
      LOCAL INFILE 'temp-1.csv' 
      INTO TABLE person 
      FIELDS 
      TERMINATED BY ',' 
      ENCLOSED BY '"' 
      ESCAPED BY '"' 
      LINES 
      TERMINATED BY '\n' 
      IGNORE 1 LINES 
     ; 
Query OK, 9 rows affected (0.00 sec) 
Records: 9 Deleted: 0 Skipped: 0 Warnings: 0 

mysql> SELECT * FROM person; 
+------+------------------------+ 
| ID | UID     | 
+------+------------------------+ 
| 0 | Steve the Pirate  | 
| 10 |      | 
| 1 | \Alpha     | 
| 2 | Hoban "Wash" Washburne | 
| 3 | Pastor Veal   | 
| 4 | Tucker     | 
| 5 | Simon     | 
| 6 | Sonny     | 
| 7 | Wat\     | 
+------+------------------------+ 
9 rows in set (0.00 sec) 

Ya başlığında dahil tüm satırları yükleyebilirsiniz: "" benim giriş dosyası sonu hiçbir çizgiler halinde

mysql> DELETE FROM person; 
Query OK, 9 rows affected (0.00 sec) 

mysql> LOAD DATA 
      LOCAL INFILE 'temp-1.csv' 
      INTO TABLE person 
      FIELDS 
      TERMINATED BY ',' 
      ENCLOSED BY '"' 
      ESCAPED BY '"' 
      LINES 
      TERMINATED BY '\n' 
      IGNORE 0 LINES 
     ; 
Query OK, 11 rows affected, 1 warning (0.01 sec) 
Records: 11 Deleted: 0 Skipped: 0 Warnings: 1 

mysql> show warnings; 
+---------+------+--------------------------------------------------------+ 
| Level | Code | Message            | 
+---------+------+--------------------------------------------------------+ 
| Warning | 1366 | Incorrect integer value: 'ID' for column 'ID' at row 1 | 
+---------+------+--------------------------------------------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT * FROM person; 
+------+------------------------+ 
| ID | UID     | 
+------+------------------------+ 
| 0 | UID     | 
| 9 |      | 
| 0 | Steve the Pirate  | 
| 10 |      | 
| 1 | \Alpha     | 
| 2 | Hoban "Wash" Washburne | 
| 3 | Pastor Veal   | 
| 4 | Tucker     | 
| 5 | Simon     | 
| 6 | Sonny     | 
| 7 | Wat\     | 
+------+------------------------+ 
11 rows in set (0.00 sec) 

:

mysql> DELETE FROM person; 
Query OK, 11 rows affected (0.00 sec) 

mysql> LOAD DATA 
      LOCAL INFILE 'temp-2.csv' 
      INTO TABLE person 
      FIELDS 
      TERMINATED BY ',' 
      ENCLOSED BY '"' 
      ESCAPED BY '"' 
      LINES 
      TERMINATED BY '\n' 
      IGNORE 1 LINES 
     ; 
Query OK, 0 rows affected (0.00 sec) 
Records: 0 Deleted: 0 Skipped: 0 Warnings: 0 

mysql> SELECT * FROM person; 
Empty set (0.00 sec) 
:

shell% cat temp-2.csv 
"ID","UID" 
"0","Steve the Pirate" 
"1","\Alpha" 
"2","Hoban ""Wash"" Washburne" 
"3","Pastor Veal" 
"4","Tucker" 
"5","Simon" 
"6","Sonny" 
"7","Wat\" 

sonra hiçbir satırları yükleyebilir ya

Veya başlıkları da dahil olmak üzere tüm satırları yükleyebilirim:

mysql> DELETE FROM person; 
Query OK, 0 rows affected (0.00 sec) 

mysql> LOAD DATA 
      LOCAL INFILE 'temp-2.csv' 
      INTO TABLE person 
      FIELDS 
      TERMINATED BY ',' 
      ENCLOSED BY '"' 
      ESCAPED BY '"' 
      LINES 
      TERMINATED BY '\n' 
      IGNORE 0 LINES 
     ; 
Query OK, 9 rows affected, 1 warning (0.03 sec) 
Records: 9 Deleted: 0 Skipped: 0 Warnings: 1 

mysql> show warnings; 
+---------+------+--------------------------------------------------------+ 
| Level | Code | Message            | 
+---------+------+--------------------------------------------------------+ 
| Warning | 1366 | Incorrect integer value: 'ID' for column 'ID' at row 1 | 
+---------+------+--------------------------------------------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT * FROM person; 
+------+------------------------+ 
| ID | UID     | 
+------+------------------------+ 
| 0 | UID     | 
| 0 | Steve the Pirate  | 
| 1 | \Alpha     | 
| 2 | Hoban "Wash" Washburne | 
| 3 | Pastor Veal   | 
| 4 | Tucker     | 
| 5 | Simon     | 
| 6 | Sonny     | 
| 7 | Wat\     | 
+------+------------------------+ 
9 rows in set (0.00 sec) 

Şimdi yanlış yapmak için birçok yol keşfettim, bu dosyaları veritabanımdaki veriye aktarmak için LOAD DATA'u nasıl kullanabilirim? the documentation for LOAD DATA, treating doubled double quotes as a double quote is the default göre

cevap

15

: alan karakteri tarafından çevrelenmiş başlıyorsa

, bu karakterin örnekleri sekansı tarafından sona erdirilen bir alan veya çizgi takip sadece bir alan değeri sonlandırma olarak kabul edilmektedir. Belirsizlikten kaçınmak için, bir alan değerindeki ENCLOSED BY karakterinin oluşumu iki katına çıkarılabilir ve karakterin tek bir örneği olarak yorumlanır. burada gösterildiği gibi '' "çevrelediği Örneğin, belirtilen, tırnak işaretleri işlenir:

"The ""BIG"" boss" -> The "BIG" boss 
The "BIG" boss  -> The "BIG" boss 
The ""BIG"" boss -> The ""BIG"" boss 

yüzden ESCAPED BY '' kullanarak, bir kaçış karakteri olarak \ yorumlayarak devre dışı yapmanız gereken.

LOAD DATA 
    LOCAL INFILE 'temp-1.csv' 
    INTO TABLE person 
    FIELDS 
    TERMINATED BY ',' 
    ENCLOSED BY '"' 
    ESCAPED BY '' 
    LINES 
    TERMINATED BY '\n' 
    IGNORE 1 LINES 
; 
+0

+1 Öneriniz bana bir daha sorunu çözmek yardımcı oldu. Ben csv içinde çift tırnak içinde tüm alanları vardı ve alan boşsa, csv sadece iki boş tırnak olurdu "" - kaçan karakter olması ve veri alma komutumun çalışmadığı varsayılıyordu. ESCAPED BY '' işini yaptı. Teşekkürler. – Aakash

+0

Kaçan karakterin olmadığı gibi, tam olarak rfc 4180 olan verilere sahibim. Bir alanda bir virgül varsa, o zaman çift tırnak içine alınmalıdır. Bu durumda 'ESCAPED BY' ''çalışır mı? – CMCDragonkai

İlgili konular