我有一個來自客戶端的非標準化事件日記 CSV,我正在嘗試將其載入到 MySQL 表中,以便可以重構為正常的格式。我建立了一個名為「CSVImport」的表,其中 CSV 檔案的每一列都有一個欄位。 CSV 包含 99 列,因此這本身就是一項艱鉅的任務:
CREATE TABLE 'CSVImport' (id INT); ALTER TABLE CSVImport ADD COLUMN Title VARCHAR(256); ALTER TABLE CSVImport ADD COLUMN Company VARCHAR(256); ALTER TABLE CSVImport ADD COLUMN NumTickets VARCHAR(256); ... ALTER TABLE CSVImport Date49 ADD COLUMN Date49 VARCHAR(256); ALTER TABLE CSVImport Date50 ADD COLUMN Date50 VARCHAR(256);
表上沒有任何約束,所有欄位都保存VARCHAR(256) 值,除了包含計數(以INT 表示)、是/否(以BIT 表示)、價格(以DECIMAL 表示)和文字簡介(以TEXT 表示)。
我嘗試將資料載入到文件中:
LOAD DATA INFILE '/home/paul/clientdata.csv' INTO TABLE CSVImport; Query OK, 2023 rows affected, 65535 warnings (0.08 sec) Records: 2023 Deleted: 0 Skipped: 0 Warnings: 198256 SELECT * FROM CSVImport; | NULL | NULL | NULL | NULL | NULL | ...
整個表都填滿了NULL
。
我認為問題在於文字簡介包含不只一行,而 MySQL 正在解析該文件,就好像每一新行都對應於一個資料庫行。我可以毫無問題地將文件載入到 Open中。
clientdata.csv 檔案包含 2593 行和 570 筆記錄。第一行包含列名稱。我認為它是逗號分隔的,而且文字顯然是用雙引號分隔的。
更新:
如有疑問,請閱讀手冊:http://dev.mysql.com/doc/refman/5.0/en/load-data.html
我在 LOAD DATA
語句中添加了一些信息, 足夠智能來推斷,現在它加載了正確數量的記錄:
LOAD DATA INFILE "/home/paul/clientdata.csv" INTO TABLE CSVImport COLUMNS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '"' LINES TERMINATED BY 'n' IGNORE 1 LINES;
但仍然有很多完全 NULL
記錄,並且載入的資料似乎都沒有在正確的位置。
使用mysqlimport將表格載入到資料庫中: p>
我在 http 找到它://chriseiffel.com/everything-linux/how-to-import-a-large-csv-file-to-mysql/
#要讓分隔符號成為製表符,請使用
--fields-termerated-by='\t'
問題的核心似乎是將 CSV 檔案中的列與表中的列進行匹配。
許多圖形化的 mySQL 用戶端對於這類事情都有非常好的匯入對話方塊。
我最喜歡的工作是基於 Windows 的 HeidiSQL。它為您提供了一個圖形介面來建立
LOAD DATA
命令;您可以稍後以程式設計方式重複使用它。螢幕截圖:「匯入文字檔案」對話框
#要開啟「匯入文字檔案」對話框,請前往
工具 > 匯入 CSV 檔案
: