2010-06-18 43 views
6

我將如何解決創建檢查Excel(或CSV)文件的MYSQL表格模式。 是否有任何準備好的Python庫用於該任務?生成表格模式檢查Excel(CSV)並導入數據

列標題將被清理爲列名稱。數據類型將根據電子表格列的內容進行估算。完成後,數據將被加載到表格中。

我有一個〜200列的Excel文件,我想開始正常化。

+0

一些更多的想法:http:///stackoverflow.com/q/9998596/395857 – 2013-11-14 17:36:00

回答

1

只爲(我的)的參考,我在下面記錄我所做的:

  1. XLRD是可行的,但是我剛剛保存的Excel數據爲CSV,這樣我就可以使用LOAD DATA INFILE
  2. 我VE複製標題行,開始寫的導入和標準化腳本
  3. 腳本的作用:與所有的列TEXT CREATE TABLE,除了主鍵
  4. 查詢MySQL的:LOAD DATA LOCAL INFILE加載所有CSV數據轉換成文本字段。
  5. 基於PROCEDURE ANALYSE的輸出,我能夠ALTER TABLE給列正確的類型和長度。 PROCEDURE ANALYSE返回ENUM對於任何有很少不同值的列,這不是我所需要的,但是我發現稍後有用於標準化。眼球200列與PROCEDURE ANALYSE輕而易舉。 PhpMyAdmin的輸出建議表結構是垃圾。
  6. 我寫了一些標準化,主要使用SELECT DISTINCT列和INSERT ing結果分開表。我已經在舊錶中添加了FK列。在INSERT之後,我有了它的ID和UPDATE編輯了FK列。當循環完成時,我已經丟棄舊列,只留下FK列。與多個依賴列類似。它比我預期的要快得多。
  7. 我跑(django)python manage.py inspctdb,複製輸出到models.py並添加所有那些ForeignkeyField s作爲FKs不存在MyISAM。寫了一個小蟒蛇views.py,urls.py,幾個模板...... TADA
1

快速和骯髒的解決方法與phpMyAdmin:

  • 與列適量創建一個表。確保數據符合列。
  • 將CSV導入到表格中。
  • 使用建議表結構
+1

好的,PhpMyAdmin的確:「選擇*從table_name PROCEDURE ANALYZE()」。這可以幫助我。 http://dev.mysql.com/doc/refman/5.0/en/procedure-analyse.html – 2010-06-21 09:20:32

1

據我所知,沒有可以自動執行此過程的工具(我之前喜歡有人證明我錯了,因爲我之前有過這個確切的問題)。 當我這樣做時,我想出了兩個選擇:
(1)在db中用相應類型手動創建列,然後導入,或者
(2)編寫一些可以「計算出」列應該是什麼數據類型。 我選擇了第一個選項,主要是因爲我不認爲我實際上可以編寫一個程序來進行類型推斷。
如果您決定編寫一個類型推斷工具/轉換,您可能需要處理幾個問題:
(1)Excel日期實際上存儲爲自1899年12月31日以來的天數;那麼人們如何推斷出一列是日期而不是一些數字數據(例如人口)呢?
(2)對於文本字段,是否只創建varchar(n)類型的列,其中n是該列中最長的條目,或者如果其中一個條目長於某個上限限制?如果是這樣,什麼是一個好的上限?
(3)如何以正確的精度自動將浮點數轉換爲小數點,並且不會丟失任何地方?
顯然,這並不意味着你將無法(我是一個非常糟糕的程序員)。我希望你這樣做,因爲它是一個非常有用的工具。

3

使用xlrd模塊; start here。 [免責聲明:我是作者]。 xlrd將單元格分類爲文本,數字,日期,布爾值,錯誤,空白和空白。它通過檢查與單元格相關的格式(例如「dd/mm/yyyy」與「0.00」)來區分日期和數字。

編寫一些代碼以通過用戶輸入的數據來確定每個列使用的DB數據類型是不是可以輕鬆實現自動化的東西。你應該能夠看到數據並分配整數,金錢,文本,日期,日期時間,時間等類型,並編寫代碼來檢查你的猜測。請注意,您需要能夠處理諸如在文本字段中輸入的數字或日期數據(可以在GUI中看起來OK)。您需要一種策略來處理不符合「估計」數據類型的單元格。您需要驗證並清理您的數據。請確保您對文本字符串進行了規範化處理(剝去前導/後綴空格,用一個空格替換多個空格.Excel text爲(僅限BMP)Unicode;不要將其打成ASCII或「ANSI」 - 以Unicode編碼並編碼UTF-8將其放入數據庫中。