2014-01-23 58 views
1

我想在終端中將文本文件導入到MySQL中。文本文件太大而無法打開並查看,但我知道它是''''分隔。將文本文件導入到mySQL中不知道表數據類型

我發現了一個博客,說這樣做:

LOAD DATA INFILE '/tmp/data.txt' 
INTO TABLE db1.table1 
FIELDS TERMINATED BY '|'; 

我試過,但SQL告訴我,先創建表,我做到了。但它也想知道我相信的字段名稱。在線研究似乎表明,當我製作表格時,我必須指定字段標題及其數據類型。

有沒有辦法解決這個問題?我必須輸入大約20個字段名稱,而且我甚至不知道它們的數據類型。

還有別的辦法嗎?

編輯評論如下

我設法用頭-n 3路徑/到/文件以獲取頭部和結果是:

 
NIM_EVENT_ID|NIM_EVENT_DATA_TYPE_ID|NIM_EVENT_TYPE_ID|EVENT_TIMESTAMP|EVENT_GMT_TIMESTAMP|PRODUCT_ISSUE_ID|NIM_TITLE_ID|NIM_ISSUE_ID|NIM_USER_ID|RECORD_ID|TRANSACTION_ID|DWELL_MINUTES|FREE_TRIAL_FLAG|UNLIMITED_FLAG|APPLICATION_VERSION_ID|DEVICE_GUID|DEVICE_INFO_ID|DEVICE_BRAND|DEVICE_PRODUCT|DEVICE_TYPE|DEVICE_HARDWARE|DEVICE_MANUFACTURER|DEVICE_MODEL|DEVICE_OS|DEVICE_OS_VERSION|DEVICE_DISPLAY_INFO|DEVICE_DISPLAY_SIZE|DEVICE_DISPLAY_ORIENTATION_ID|EVENT_VERSION|SOURCE_CREATE_TIMESTAMP|SOURCE_LAST_MODIFIED_TIMESTAMP|WORKFLOW_RUN_ID|ETL_CREATE_DATE|ETL_UPDATE_DATE|SOURCE_FILE_ID 
    103008184|879|883|2013-12-07 00:30:35.027000|2013-12-07 05:30:35.027000|-1|4800010|36000003|57700008|61906389|21385144|0|Y|Y||4c22c4a3-094a-476f-9a48-c67b15c2d3f7|-2|||||||||||887|2|2013-12-06 21:35:39.023000|2013-12-06 21:35:39.023000||2013-12-07 03:31:33.910000|2013-12-07 03:31:33.910000| 
    98500241|875|880|2013-12-07 15:43:36.984000|2013-12-07 20:43:36.984000|-1|-2|-2|82700012|63226292|||N|N|-i6.1.3-APPLE-3.10.0|45F4BCE1-A6DC-4A66-A071-7D628FC7522E|21|Apple|iPhone OS|iPad|iPad|Apple|iPad|iOS|6.1.3|iPad|DisplayMetrics{width=768.000000, height=1024.000000, scale=2.000000}|887|2|2013-12-07 12:45:50.099000|2013-12-07 12:45:50.099000||2013-12-07 19:31:34.470000|2013-12-07 19:31:34.470000| 

我猜什麼人我的訴說我這裏是創建一個腳本來複制頭部和字段信息,以創建.SQL表?那就是我們正在做的 - 從頭部複製格式以創建一個表格來導入txt文件到?

+1

快速僅供參考 - 這會更普遍被稱爲是管道分隔 – Dan

+0

它是一個數據庫轉儲或表傾倒?你能讀/查看文件的尾部或頭部嗎? – crnlx

+0

@crnlx我有大約10個表,我必須作爲數據庫加載。我打算把每一個單獨做成一張桌子。你是說有一種方法可以將一組文本文件作爲數據庫導入,其中每個文本文件都是一個表格? –

回答

1

我是否必須手動查看輸出並嘗試確定每個字段int new SQL table?有沒有使用這個輸出的快捷方式?

一個好的文本編輯器是你最好的朋友。以下是我在一兩分鐘,想出了對TextMate

CREATE TABLE import_table 
(
    nim_event_id INT, 
    nim_event_data_type_id INT, 
    nim_event_type_id INT, 
    event_timestamp DATETIME, 
    event_gmt_timestamp DATETIME, 
    product_issue_id INT, 
    nim_title_id INT, 
    nim_issue_id INT, 
    nim_user_id INT, 
    record_id INT, 
    transaction_id INT, 
    dwell_minutes INT, 
    free_trial_flag CHAR(1), 
    unlimited_flag CHAR(1), 
    application_version_id VARCHAR(128), 
    device_guid CHAR(37), 
    device_info_id VARCHAR(128), 
    device_brand VARCHAR(128), 
    device_product VARCHAR(128), 
    device_type VARCHAR(128), 
    device_hardware VARCHAR(128), 
    device_manufacturer VARCHAR(128), 
    device_model VARCHAR(128), 
    device_os VARCHAR(128), 
    device_os_version VARCHAR(128), 
    device_display_info VARCHAR(128), 
    device_display_size VARCHAR(128), 
    device_display_orientation_id INT, 
    event_version INT, 
    source_create_timestamp DATETIME, 
    source_last_modified_timestamp DATETIME, 
    workflow_run_id INT, 
    etl_create_date DATETIME, 
    etl_update_date DATETIME, 
    source_file_id INT 
); 

我們能夠控制插入您可以利用會話變量和LOAD DATA INFILESET子句值。例如。設置爲NULL缺席值在你的表,你可以做

LOAD DATA INFILE '/tmp/data.txt' 
INTO TABLE import_table 
    FIELDS TERMINATED BY '|' 
    LINES TERMINATED BY '\n' -- or '\r\n' if the file has been created on a Windows machine 
IGNORE 1 LINES -- skip the header line 
(
    @nim_event_id, 
    @nim_event_data_type_id, 
    @nim_event_type_id, 
    @event_timestamp, 
    @event_gmt_timestamp, 
    @product_issue_id, 
    @nim_title_id, 
    @nim_issue_id, 
    @nim_user_id, 
    @record_id, 
    @transaction_id, 
    @dwell_minutes, 
    @free_trial_flag, 
    @unlimited_flag, 
    @application_version_id, 
    @device_guid, 
    @device_info_id, 
    @device_brand, 
    @device_product, 
    @device_type, 
    @device_hardware, 
    @device_manufacturer, 
    @device_model, 
    @device_os, 
    @device_os_version, 
    @device_display_info, 
    @device_display_size, 
    @device_display_orientation_id, 
    @event_version, 
    @source_create_timestamp, 
    @source_last_modified_timestamp, 
    @workflow_run_id, 
    @etl_create_date, 
    @etl_update_date, 
    @source_file_id 
) 
SET 
    nim_event_id = NULLIF(@nim_event_id, ''), 
    nim_event_data_type_id = NULLIF(@nim_event_data_type_id, ''), 
    nim_event_type_id = NULLIF(@nim_event_type_id, ''), 
    event_timestamp = NULLIF(@event_timestamp, ''), 
    event_gmt_timestamp = NULLIF(@event_gmt_timestamp, ''), 
    product_issue_id = NULLIF(@product_issue_id, ''), 
    nim_title_id = NULLIF(@nim_title_id, ''), 
    nim_issue_id = NULLIF(@nim_issue_id, ''), 
    nim_user_id = NULLIF(@nim_user_id, ''), 
    record_id = NULLIF(@record_id, ''), 
    transaction_id = NULLIF(@transaction_id, ''), 
    dwell_minutes = NULLIF(@dwell_minutes, ''), 
    free_trial_flag = NULLIF(@free_trial_flag, ''), 
    unlimited_flag = NULLIF(@unlimited_flag, ''), 
    application_version_id = NULLIF(@application_version_id, ''), 
    device_guid = NULLIF(@device_guid, ''), 
    device_info_id = NULLIF(@device_info_id, ''), 
    device_brand = NULLIF(@device_brand, ''), 
    device_product = NULLIF(@device_product, ''), 
    device_type = NULLIF(@device_type, ''), 
    device_hardware = NULLIF(@device_hardware, ''), 
    device_manufacturer = NULLIF(@device_manufacturer, ''), 
    device_model = NULLIF(@device_model, ''), 
    device_os = NULLIF(@device_os, ''), 
    device_os_version = NULLIF(@device_os_version, ''), 
    device_display_info = NULLIF(@device_display_info, ''), 
    device_display_size = NULLIF(@device_display_size, ''), 
    device_display_orientation_id = NULLIF(@device_display_orientation_id, ''), 
    event_version = NULLIF(@event_version, ''), 
    source_create_timestamp = NULLIF(@source_create_timestamp, ''), 
    source_last_modified_timestamp = NULLIF(@source_last_modified_timestamp, ''), 
    workflow_run_id = NULLIF(@workflow_run_id, ''), 
    etl_create_date = NULLIF(@etl_create_date, ''), 
    etl_update_date = NULLIF(@etl_update_date, ''), 
    source_file_id = NULLIF(@source_file_id, '') 
; 

您可以進一步調整它根據需要。上述語句成功加載自己張貼

這裏有兩個樣本行的結果:

 
+--------------+------------------------+-------------------+---------------------+---------------------+------------------+--------------+--------------+-------------+-----------+----------------+---------------+-----------------+----------------+------------------------+--------------------------------------+----------------+--------------+----------------+-------------+-----------------+---------------------+--------------+-----------+-------------------+---------------------+----------------------------------------------------------------------+-------------------------------+---------------+-------------------------+--------------------------------+-----------------+---------------------+---------------------+----------------+ 
| nim_event_id | nim_event_data_type_id | nim_event_type_id | event_timestamp  | event_gmt_timestamp | product_issue_id | nim_title_id | nim_issue_id | nim_user_id | record_id | transaction_id | dwell_minutes | free_trial_flag | unlimited_flag | application_version_id | device_guid       | device_info_id | device_brand | device_product | device_type | device_hardware | device_manufacturer | device_model | device_os | device_os_version | device_display_info | device_display_size             | device_display_orientation_id | event_version | source_create_timestamp | source_last_modified_timestamp | workflow_run_id | etl_create_date  | etl_update_date  | source_file_id | 
+--------------+------------------------+-------------------+---------------------+---------------------+------------------+--------------+--------------+-------------+-----------+----------------+---------------+-----------------+----------------+------------------------+--------------------------------------+----------------+--------------+----------------+-------------+-----------------+---------------------+--------------+-----------+-------------------+---------------------+----------------------------------------------------------------------+-------------------------------+---------------+-------------------------+--------------------------------+-----------------+---------------------+---------------------+----------------+ 
| 103008184 |     879 |    883 | 2013-12-07 00:30:35 | 2013-12-07 05:30:35 |    -1 |  4800010 |  36000003 | 57700008 | 61906389 |  21385144 |    0 | Y    | Y    | NULL     | 4c22c4a3-094a-476f-9a48-c67b15c2d3f7 | -2    | NULL   | NULL   | NULL  | NULL   | NULL    | NULL   | NULL  | NULL    | NULL    | NULL                 |       887 |    2 | 2013-12-06 21:35:39  | 2013-12-06 21:35:39   |   NULL | 2013-12-07 03:31:34 | 2013-12-07 03:31:34 |   NULL | 
|  98500241 |     875 |    880 | 2013-12-07 15:43:37 | 2013-12-07 20:43:37 |    -1 |   -2 |   -2 | 82700012 | 63226292 |   NULL |   NULL | N    | N    | -i6.1.3-APPLE-3.10.0 | 45F4BCE1-A6DC-4A66-A071-7D628FC7522E | 21    | Apple  | iPhone OS  | iPad  | iPad   | Apple    | iPad   | iOS  | 6.1.3    | iPad    | DisplayMetrics{width=768.000000, height=1024.000000, scale=2.000000} |       887 |    2 | 2013-12-07 12:45:50  | 2013-12-07 12:45:50   |   NULL | 2013-12-07 19:31:34 | 2013-12-07 19:31:34 |   NULL | 
+--------------+------------------------+-------------------+---------------------+---------------------+------------------+--------------+--------------+-------------+-----------+----------------+---------------+-----------------+----------------+------------------------+--------------------------------------+----------------+--------------+----------------+-------------+-----------------+---------------------+--------------+-----------+-------------------+---------------------+----------------------------------------------------------------------+-------------------------------+---------------+-------------------------+--------------------------------+-----------------+---------------------+---------------------+----------------+ 
1

有很多方法可以解決這個問題,這裏有一種方法。其中一些步驟可以通過實用程序縮短 - 我假設你沒有任何一個。

編寫一個程序來讀取文件,並將每行的每個字段的長度打印到一個單獨的文件中。所以,你總會有文件一樣field00.txtfield01.txt等 (注:你可以用任何文本編輯器和RegEx很容易地做到這一點) 每個文件的內容將是這樣的:

14 
12 
15 

現在,您需要找到每個文件中的最大數量。編寫程序或使用文本編輯器對文件進行排序。

(注:如果你是好與外殼,您可以使用剪切/排序做上述所有的)

在這一點上,你會知道每個字段的表中的最大長度。通過使用預覽,您也可以推斷出數據類型。根據這些信息,爲表格創建一個描述。嘗試導入數據。如果失敗,請參閱錯誤消息並調整數據類型。再試一次,直到你成功。

編輯:剛剛閱讀您的評論。所以這裏的東西,使用終端:

終端命令

(警告:我沒有接取到Mac,現在所以沒有測試)

首先,寫出每個列到自己的文件:

cut -d'|' -f1 bigfile.txt > col01.txt 
cut -d'|' -f2 bigfile.txt > col02.txt 
cut -d'|' -f3 bigfile.txt > col03.txt 
... 
cut -d'|' -f20 bigfile.txt > col20.txt 

然後找到每個列的最大長度:

awk '{ if (length > max) max = length } END { print max } ' col01.txt 
awk '{ if (length > max) max = length } END { print max } ' col02.txt 
awk '{ if (length > max) max = length } END { print max } ' col03.txt 
... 
awk '{ if (length > max) max = length } END { print max } ' col20.txt 

(注:由於您使用的是Mac OS X,wc -L將無法​​正常工作。)

檢查每一列的前幾個值,像這樣:

head col01.txt 
head col02.txt 
... 
head col20.txt 

現在你知道的數據類型和每列的最大長度。基於此,申報/創建您的表格。

+0

感謝您的回答@crnlx。我希望爲非程序員類型提供更直接的東西。我敢肯定,這個方法對於這個論壇上的大多數人來說都很簡單,但是對MySQL有點經驗不足,我希望能找到更快,更用戶友好的方式。 我也嘗試加載到PHPmyAdmin,但文件太大 - 它根本無法加載。 –

+0

@DougFirr:剛剛爲你添加了一些命令。你可以試試嗎? – crnlx