Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

PHP - Impor file CSV ke database mysql Menggunakan LOAD DATA INFILE

Jika Anda melakukan echo($sql); sebelum Anda menjalankannya, Anda akan melihat bahwa sintaks kueri Anda salah karena alasan berikut:

  1. Nama file harus diapit dalam tanda kutip daripada tanda centang balik karena ini adalah string literal bukan pengenal.

  2. Sama sekali tidak perlu memanggil mysql_escape_string() untuk menentukan pembatas di FIELDS TERMINATED BY dan ENCLOSED BY dan ESCAPED BY klausa.

  3. Anda terlalu sering menggunakan backtick. Bahkan dalam kasus Anda, karena tidak ada kata khusus yang digunakan, Anda membuang semuanya. Mereka hanya menambah kekacauan.

  4. Di akhir baris pertama file CSV, Anda harus memiliki ,,, karena Anda menggunakannya sebagai bagian dari pembatas garis. Jika Anda tidak melakukannya, Anda tidak hanya akan melewati baris pertama tetapi juga baris kedua yang berisi data.

  5. Anda tidak dapat menggunakan ENCLOSED BY klausa lebih dari satu kali. Anda harus berurusan dengan Number bidang dengan cara yang berbeda.

  6. Melihat baris sampel Anda IMHO, Anda tidak perlu ESCAPED BY . Tetapi jika Anda merasa membutuhkannya gunakan seperti ini ESCAPED BY '\\' .

Dikatakan bahwa pernyataan yang benar secara sintaksis mungkin terlihat seperti ini

LOAD DATA INFILE 'detection.csv'
INTO TABLE calldetections
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"' 
LINES TERMINATED BY ',,,\r\n'
IGNORE 1 LINES 
(date, name, type, number, duration, addr, pin, city, state, country, lat, log)

Sekarang IMHO Anda perlu mengubah beberapa bidang saat Anda memuatnya:

  1. jika date di tabel Anda adalah datetime tipe data maka perlu diubah, jika tidak, Anda akan mendapatkan kesalahan

    Nilai tanggal waktu salah:'18 Sep-2013 13:53:45' untuk kolom 'tanggal' pada baris

  2. anda harus berurusan dengan qoutes tunggal di sekitar nilai dalam Number bidang

  3. kemungkinan besar Anda ingin mengubah "null" string literal ke NULL yang sebenarnya untuk addr, pin, city, state, country kolom

  4. jika durasi selalu dalam detik maka Anda dapat mengekstrak nilai bilangan bulat dari detik dan menyimpannya seperti itu di tabel Anda agar dapat dengan mudah menggabungkan nilai durasi nanti.

Meskipun demikian, versi pernyataan yang berguna akan terlihat seperti ini

LOAD DATA INFILE 'detection.csv'
INTO TABLE calldetections
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"' 
LINES TERMINATED BY ',,,\r\n'
IGNORE 1 LINES 
(@date, name, type, @number, @duration, @addr, @pin, @city, @state, @country, lat, log)
SET date = STR_TO_DATE(@date, '%b-%d-%Y %h:%i:%s %p'),
    number = TRIM(BOTH '\'' FROM @number),
    duration = 1 * TRIM(TRAILING 'Secs' FROM @duration),
    addr = NULLIF(@addr, 'null'),
    pin  = NULLIF(@pin, 'null'),
    city = NULLIF(@city, 'null'),
    state = NULLIF(@state, 'null'),
    country = NULLIF(@country, 'null') 

Di bawah ini adalah hasil mengeksekusi kueri di mesin saya

mysql> LOAD DATA INFILE '/tmp/detection.csv'
    -> INTO TABLE calldetections
    -> FIELDS TERMINATED BY ','
    -> OPTIONALLY ENCLOSED BY '"' 
    -> LINES TERMINATED BY ',,,\n'
    -> IGNORE 1 LINES 
    -> (@date, name, type, @number, @duration, @addr, @pin, @city, @state, @country, lat, log)
    -> SET date = STR_TO_DATE(@date, '%b-%d-%Y %h:%i:%s %p'),
    ->     number = TRIM(BOTH '\'' FROM @number),
    ->     duration = 1 * TRIM(TRAILING 'Secs' FROM @duration),
    ->     addr = NULLIF(@addr, 'null'),
    ->     pin  = NULLIF(@pin, 'null'),
    ->     city = NULLIF(@city, 'null'),
    ->     state = NULLIF(@state, 'null'),
    ->     country = NULLIF(@country, 'null');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Deleted: 0  Skipped: 0  Warnings: 0

mysql> select * from calldetections;
+---------------------+---------+---------------+-------------+----------+------+------+------+-------+---------+------+------+
| date                | name    | type          | number      | duration | addr | pin  | city | state | country | lat  | log  |
+---------------------+---------+---------------+-------------+----------+------+------+------+-------+---------+------+------+
| 2013-09-18 13:53:45 | Unknown | outgoing call | 123456      |        0 | NULL | NULL | NULL | NULL  | NULL    | 0.0  | 0.0  |
| 2013-09-18 13:54:14 | Unknown | outgoing call | 1234567890  |        0 | NULL | NULL | NULL | NULL  | NULL    | 0.0  | 0.0  |
| 2013-09-18 13:54:37 | Unknown | outgoing call | 14772580369 |        1 | NULL | NULL | NULL | NULL  | NULL    | 0.0  | 0.0  |
+---------------------+---------+---------------+-------------+----------+------+------+------+-------+---------+------+------+
3 rows in set (0.00 sec)

Dan akhirnya di php menetapkan string kueri ke $sql variabel akan terlihat seperti ini

$sql = "LOAD DATA INFILE 'detection.csv'
        INTO TABLE calldetections
        FIELDS TERMINATED BY ','
        OPTIONALLY ENCLOSED BY '\"' 
        LINES TERMINATED BY ',,,\\r\\n'
        IGNORE 1 LINES 
        (@date, name, type, @number, @duration, @addr, @pin, @city, @state, @country, lat, log)
        SET date = STR_TO_DATE(@date, '%b-%d-%Y %h:%i:%s %p'),
            number = TRIM(BOTH '\'' FROM @number),
            duration = 1 * TRIM(TRAILING 'Secs' FROM @duration),
            addr = NULLIF(@addr, 'null'),
            pin  = NULLIF(@pin, 'null'),
            city = NULLIF(@city, 'null'),
            state = NULLIF(@state, 'null'),
            country = NULLIF(@country, 'null') ";


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggunakan fungsi password_hash dan password_verify PHP 5.5

  2. Apa string koneksi driver MySQL JDBC?

  3. Lewati array ke rutinitas tersimpan MySQL

  4. Menghitung Ukuran Pool Buffer InnoDB untuk Server MySQL Anda

  5. Diperlukan untuk menggabungkan 2 tabel dengan FK mereka di tabel ke-3