Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

PHP - Nhập tệp CSV vào cơ sở dữ liệu mysql bằng cách sử dụng TẢI THÔNG TIN DỮ LIỆU

Nếu bạn thực hiện echo($sql); trước khi thực thi, bạn sẽ thấy rằng cú pháp truy vấn của mình không chính xác vì những lý do sau:

  1. Tên tệp phải được đặt trong dấu ngoặc kép thay vì dấu gạch ngược vì nó là một chuỗi ký tự không phải là một số nhận dạng.

  2. Hoàn toàn không cần gọi mysql_escape_string() để chỉ định dấu phân tách trong FIELDS TERMINATED BYENCLOSED BYESCAPED BY mệnh đề.

  3. Bạn sử dụng quá nhiều backticks. Thực tế trong trường hợp của bạn, vì không có từ dành riêng nào được sử dụng, bạn bỏ tất cả chúng đi. Chúng chỉ thêm lộn xộn.

  4. Ở cuối dòng đầu tiên của tệp CSV, bạn phải có ,,, bởi vì bạn sử dụng chúng như một phần của dấu phân cách dòng. Nếu bạn không làm như vậy, bạn sẽ bỏ qua không chỉ dòng đầu tiên mà còn bỏ qua dòng thứ hai chứa dữ liệu.

  5. Bạn không thể sử dụng ENCLOSED BY mệnh đề nhiều hơn một lần. Bạn phải đối phó với Number theo một cách khác.

  6. Nhìn vào các hàng mẫu của bạn NGAY LẬP TỨC, bạn không cần ESCAPED BY . Nhưng nếu bạn cảm thấy cần nó, hãy sử dụng nó như thế này ESCAPED BY '\\' .

Điều đó được cho là một câu lệnh đúng về mặt cú pháp có thể trông như thế này

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)

Bây giờ IMHO, bạn cần phải chuyển đổi khá nhiều trường trong khi tải chúng:

  1. nếu date trong bảng của bạn là datetime kiểu dữ liệu thì nó cần được chuyển đổi, nếu không bạn sẽ gặp lỗi

    Giá trị ngày giờ không chính xác:'Ngày 18 tháng 9 năm 2013 01:53:45 CH' cho cột 'ngày tháng' ở hàng

  2. bạn phải đối phó với các qoutes đơn lẻ xung quanh các giá trị trong Number lĩnh vực

  3. bạn rất có thể muốn thay đổi "null" chuỗi ký tự thành NULL thực tế cho addr, pin, city, state, country cột

  4. nếu thời lượng luôn tính bằng giây thì bạn có thể trích xuất một giá trị số nguyên của giây và lưu trữ theo cách đó trong bảng của mình để có thể dễ dàng tổng hợp các giá trị thời lượng sau này.

Điều đó được cho là một phiên bản hữu ích của câu lệnh sẽ trông giống như thế này

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') 

Dưới đây là kết quả thực hiện truy vấn trên máy của tôi

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)

Và cuối cùng trong php gán một chuỗi truy vấn cho $sql biến sẽ giống như thế này

$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. Tôi không thể lấy biểu mẫu đăng nhập của mình để kết nối tương tác đúng với cơ sở dữ liệu mySQL

  2. Làm cách nào để xuất cơ sở dữ liệu mysql bằng Command Prompt?

  3. Quyền truy cập bị từ chối đối với người dùng 'root' @ 'localhost' với PHPMyAdmin

  4. Sắp xếp lại / đặt lại khóa chính tăng tự động

  5. JSON_PRETTY () - Định dạng tài liệu JSON để dễ đọc hơn trong MySQL