MYSQL nhập dữ liệu từ csv bằng TẢI THÔNG TIN DỮ LIỆU


106

Tôi đang nhập một số dữ liệu của 20000 hàng từ tệp CSV vào Mysql.

Các cột trong CSV có thứ tự khác với các cột của bảng MySQL. Làm thế nào để tự động gán các cột tương ứng với các cột trong bảng Mysql?

Khi tôi thực hiện

LOAD DATA INFILE'abc.csv' INTO TABLE abc

truy vấn này thêm tất cả dữ liệu vào cột đầu tiên.

Vui lòng đề xuất cú pháp tự động để nhập dữ liệu vào Mysql.



Nó xảy ra với tôi, tôi phát hiện ra rằng các tập tin văn bản được viết với những đường nét chấm dứt bởi '\ r' và tôi đã cố gắng để nhập dữ liệu mong các dòng để được chấm dứt bằng cách sử dụng '\ n'
Tamer

2
Tôi đã viết hướng dẫn mở rộng để tải dữ liệu csv vào mysql cùng với công cụ tạo cú pháp trong Excel . Nó sẽ hữu ích cho người đọc.
mysql_user

Câu trả lời:


169

Bạn có thể sử dụng lệnh LOAD DATA INFILE để nhập tệp csv vào bảng.

Kiểm tra liên kết này MySQL - TẢI THÔNG TIN DỮ LIỆU .

LOAD DATA LOCAL INFILE 'abc.csv' INTO TABLE abc
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(col1, col2, col3, col4, col5...);

Đối với người dùng MySQL 8.0:

Sử dụng các LOCALrủi ro bảo mật giữ từ khóa và kể từ MySQL 8.0, LOCALkhả năng được đặt thành Falsetheo mặc định. Bạn có thể thấy lỗi:

LỖI 1148: Lệnh đã sử dụng không được phép với phiên bản MySQL này

Bạn có thể ghi đè nó bằng cách làm theo hướng dẫn trong tài liệu . Lưu ý rằng việc ghi đè như vậy không giải quyết được vấn đề bảo mật mà chỉ là sự thừa nhận rằng bạn nhận thức được và sẵn sàng chấp nhận rủi ro.


1
Tôi có thể biết IGNORE 1 LINESchính xác những gì ở đây không? Cảm ơn trước.
Koushik Das

5
@KoushikDas Nó sẽ bỏ qua dòng đầu tiên xác định tên cột
Saharsh Shah

28
thận trọng: mệnh đề LINES TERMINATED BY '\ r \ n' hoạt động đối với các tệp windows, nhưng các tệp linux chỉ nên có '\ n'.
ChuckCottrill

1
Điều quan trọng cần nhớ là sử dụng dấu gạch chéo về phía trước: stackoverflow.com/a/42878067/470749
Ryan

3
chỉ cần lưu ý rằng (col1, col2, col3 ....) là không bắt buộc. Hữu ích nếu bạn đang tạo một bảng trước khi sử dụng bảng này để chèn dữ liệu.
Kieran Quinn

51

Bạn có thể cần đặt FIELDS TERMINATED BY ','hoặc bất kỳ dấu phân cách nào xảy ra.

Đối với tệp CSV, câu lệnh của bạn sẽ giống như sau:

LOAD DATA INFILE 'data.csv' INTO TABLE tbl_name
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

1
TẢI THÔNG TIN ĐỊA PHƯƠNG DỮ LIỆU ... Nếu không có ĐỊA PHƯƠNG, quyền truy cập bị từ chối.
ketankk

49

Trước khi nhập tệp, bạn phải chuẩn bị những điều sau:

  • Một bảng cơ sở dữ liệu mà dữ liệu từ tệp sẽ được nhập vào.
  • Tệp CSV có dữ liệu khớp với số cột của bảng và loại dữ liệu trong mỗi cột.
  • Tài khoản, kết nối với máy chủ cơ sở dữ liệu MySQL, có các đặc quyền FILE và INSERT.

Giả sử chúng ta có bảng sau:

nhập mô tả hình ảnh ở đây

TẠO BẢNG SỬ DỤNG CÂU HỎI SAU:

CREATE TABLE IF NOT EXISTS `survey` (
  `projectId` bigint(20) NOT NULL,
  `surveyId` bigint(20) NOT NULL,
  `views` bigint(20) NOT NULL,
  `dateTime` datetime NOT NULL
);

Tệp CSV CỦA BẠN PHẢI ĐƯỢC ĐỊNH DẠNG CHÍNH HÃNG CHO VÍ DỤ XEM HÌNH ẢNH Đính kèm SAU:

nhập mô tả hình ảnh ở đây

Nếu mọi thứ đều ổn .. Vui lòng thực hiện truy vấn sau để TẢI DỮ LIỆU TỪ TẬP TIN CSV:

LƯU Ý: Vui lòng thêm đường dẫn tuyệt đối của tệp CSV của bạn

LOAD DATA INFILE '/var/www/csv/data.csv' 
INTO TABLE survey 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

Nếu mọi thứ đã hoàn thành. bạn đã xuất dữ liệu từ CSV sang bảng thành công


Làm cách nào chúng tôi có thể xác thực nếu tệp CSV có kiểu dữ liệu thích hợp cho mỗi cột vì theo mặc định, nó bỏ qua kiểu dữ liệu không hợp lệ.
Umar Abbas

2
Xin lỗi vì đã làm phiền một câu trả lời cũ như vậy. Nó rất thuyết phục nhưng làm thế nào tôi có thể bỏ qua một số lĩnh vực. Giả sử bảng của tôi có projectId, SurveyId và dateTime, làm cách nào để bỏ qua trường "lượt xem"?
Ansari Đan Mạch

@MD Danish Ansari, Rất tiếc phải trả lời câu hỏi cũ, nhưng bạn có thể chỉ định các cột trong bảng. Tôi đã thực hiện như sau, trong đó tôi cần bỏ qua trường đầu tiên (khóa chính tự động gia tăng), cũng như một số trường khác: LOAD DATA LOCAL INFILE 'C: \\ xampp \\ htdocs \\ data_files \\ 2018-10_st Statistics. csv 'INTO TABLE my_log_tbl LĨNH VỰC ĐƯỢC CHẤM DỨT BỞI', 'ĐƯỢC CHỨNG NHẬN BỞI' "'' CÁC DÒNG ĐƯỢC CHẤM DỨT BỞI '\ r \ n' (UserId, CustomerId, InstitutionId, ApplicationId, FullURL, AccessTimeStamp, IPaddress); Tôi đã nghĩ rằng các cột sẽ xuất hiện sau tên bảng, nhưng điều đó không hoạt động. Chúng sẽ xuất hiện ở cuối.
kalinma

17

Cú pháp:

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL]
INFILE 'file_name' INTO TABLE `tbl_name`
CHARACTER SET [CHARACTER SET charset_name]
FIELDS [{FIELDS | COLUMNS}[TERMINATED BY 'string']] 
[LINES[TERMINATED BY 'string']] 
[IGNORE number {LINES | ROWS}]

Xem Ví dụ này:

LOAD DATA LOCAL INFILE
'E:\\wamp\\tmp\\customer.csv' INTO TABLE `customer`
CHARACTER SET 'utf8'
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

10

Chèn hàng loạt hơn 7000000 bản ghi trong 1 phút vào cơ sở dữ liệu (truy vấn siêu nhanh có tính toán)

mysqli_query($cons, '
    LOAD DATA LOCAL INFILE "'.$file.'"
    INTO TABLE tablename
    FIELDS TERMINATED by \',\'
    LINES TERMINATED BY \'\n\'
    IGNORE 1 LINES
    (isbn10,isbn13,price,discount,free_stock,report,report_date)
     SET RRP = IF(discount = 0.00,price-price * 45/100,IF(discount = 0.01,price,IF(discount != 0.00,price-price * discount/100,@RRP))),
         RRP_nl = RRP * 1.44 + 8,
         RRP_bl = RRP * 1.44 + 8,
         ID = NULL
    ');
$affected = (int) (mysqli_affected_rows($cons))-1; 
$log->lwrite('Inventory.CSV to database:'. $affected.' record inserted successfully.');

RRP và RRP_nl và RRP_bl không có trong csv nhưng chúng tôi được tính toán điều đó và sau khi chèn nó.


2

Nếu bạn đang chạy LOAD DATA LOCAL INFILE từ windows shell và bạn cần sử dụng OPTIONALLY ENCLOSED BY '"', bạn sẽ phải làm như thế này để thoát các ký tự đúng cách:

"C:\Program Files\MySQL\MySQL Server 5.6\bin\mysql" -u root --password=%password% -e "LOAD DATA LOCAL INFILE '!file!' INTO TABLE !table! FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"^""' LINES TERMINATED BY '\n' IGNORE 1 LINES" --verbose --show-warnings > mysql_!fname!.out

2

giả sử bạn đang sử dụng xampp và phpmyadmin

bạn có tên tệp 'xếp hạng.txt' tên bảng 'xếp hạng' và tên cơ sở dữ liệu 'phim'

nếu xampp của bạn được cài đặt trong "C: \ xampp \"

sao chép tệp "rating.txt" của bạn trong thư mục "C: \ xampp \ mysql \ data \ phim"

LOAD DATA INFILE 'ratings.txt' INTO TABLE ratings FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES;

Hy vọng điều này có thể giúp bạn loại bỏ lỗi của mình nếu bạn đang thực hiện việc này trên localhost


0

Bạn có thể tải dữ liệu từ tệp csv hoặc tệp văn bản. Nếu bạn có một tệp văn bản với các bản ghi từ một bảng, bạn có thể tải các bản ghi đó trong bảng. Ví dụ: nếu bạn có một tệp văn bản, trong đó mỗi hàng là một bản ghi với các giá trị cho mỗi cột, bạn có thể tải các bản ghi theo cách này.

table.sql

id //field 1

name //field2

table.txt

1,peter

2,daniel

...

- ví dụ trên windows

LOAD DATA LOCAL INFILE 'C:\\directory_example\\table.txt'
INTO TABLE Table
CHARACTER SET UTF8
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'; 

0

Tôi nhận được Mã lỗi: 1290. Máy chủ MySQL đang chạy với tùy chọn --secure-file-priv nên nó không thể thực thi câu lệnh này

Điều này làm việc cho tôi trên Windows 8.1 64 bit bằng cách sử dụng wampserver 3.0.6 64bit.

Đã chỉnh sửa tệp my.ini từ C: \ wamp64 \ bin \ mysql \ mysql5.7.14

Xóa mục nhập secure_file_priv c: \ wamp64 \ tmp \ (hoặc bất cứ điều gì bạn có ở đây)

Đã dừng mọi thứ -exit wamp, v.v.- và khởi động lại mọi thứ; sau đó punt tệp cvs của tôi trên C: \ wamp64 \ bin \ mysql \ mysql5.7.14 \ data \ u242349266_recur (dir cuối cùng là tên cơ sở dữ liệu của tôi)

thực thi TẢI DỮ LIỆU THÔNG TIN 'myfile.csv'

VÀO BẢNG alumnos

CÁC LĨNH VỰC ĐƯỢC CHẤM DỨT BỞI ','

ĐƯỢC CHO PHÉP BỞI '"'

CÁC DÒNG ĐƯỢC CHẤM DỨT BỞI '\ r \ n'

BỎ QUA 1 DÒNG

... và Voila!!!


0

Bạn có thể thử chèn như thế này:

LOAD DATA INFILE '/tmp/filename.csv' replace INTO TABLE [table name] FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (field1,field2,field3);

0

Vào những ngày này (kết thúc năm 2019), tôi thích sử dụng một công cụ như http://www.convertcsv.com/csv-to-sql.htm Tôi có rất nhiều hàng bạn có thể chạy các khối được phân vùng để tiết kiệm lỗi của người dùng khi csv đến từ bảng tính người dùng cuối cùng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.