Excel(またはCSV)ファイルを検査するMYSQLテーブルスキーマを作成するにはどうすればよいですか。タスク用の準備ができている Python ライブラリはありますか?
列ヘッダーは列名にサニタイズされます。データ型は、スプレッドシートの列の内容に基づいて推定されます。完了すると、データがテーブルにロードされます。
正規化を開始したい ~200 列の Excel ファイルがあります。
Excel(またはCSV)ファイルを検査するMYSQLテーブルスキーマを作成するにはどうすればよいですか。タスク用の準備ができている Python ライブラリはありますか?
列ヘッダーは列名にサニタイズされます。データ型は、スプレッドシートの列の内容に基づいて推定されます。完了すると、データがテーブルにロードされます。
正規化を開始したい ~200 列の Excel ファイルがあります。
xlrd
モジュールを使用します。ここから始めてください。[免責事項: 私は著者です]。xlrd
セルをテキスト、数値、日付、ブール値、エラー、空白、および空に分類します。セルに関連付けられた形式を調べることによって、日付と数値を区別します (例: "dd/mm/yyyy" と "0.00")。
ユーザーが入力したデータを調べて、各列に使用する DB データ型を決定するコードをプログラミングする作業は、簡単に自動化できるものではありません。データを目で見て、整数、お金、テキスト、日付、日時、時刻などの型を割り当て、推測を確認するコードを記述できるはずです。テキストフィールドに入力された数値や日付データなどに対処できる必要があることに注意してください(GUIでは問題ないように見えます)。「推定」データ型に適合しないセルを処理する戦略が必要です。データを検証してクリーニングする必要があります。テキスト文字列を正規化してください (先頭/末尾の空白を削除し、複数の空白を単一のスペースに置き換えます。Excel テキストは (BMP のみ) Unicode です。ASCII または "ANSI" に変換しないでください。Unicode で作業し、エンコードします。 UTF-8 を使用してデータベースに配置します。
私の知る限り、このプロセスを自動化できるツールはありません (以前にこの問題が発生したことがあるので、誰かが私が間違っていることを証明してくれることを願っています)。これを行ったとき、2 つのオプションを思いつきました。
(1) db に適切な型の列を手動で作成してからインポートするか、
(2) 列のデータ型を「把握」できる何らかの種類のフィルターを作成します。する必要があります。私が最初のオプションを選択した主な理由は、型推論を実行するプログラムを実際に作成できるとは思わなかったからです。
型推論ツール/変換を作成することにした場合は、対処する必要がある可能性があるいくつかの問題があります。
(1) Excel の日付は、実際には 1899 年 12 月 31 日からの日数として保存されます。列が数値データ (たとえば、人口) ではなく日付であるとどのように推測できますか?
(2) テキスト フィールドの場合、varchar(n) 型 (n はその列の最長のエントリ) の列を作成するだけですか、それともエントリの 1 つが上限よりも長い場合は無制限の char フィールドにしますか? もしそうなら、良い上限は何ですか?
(3) どのようにして浮動小数点数を正しい精度で小数点以下に自動的に変換し、桁を失うことはありませんか?
明らかに、これはあなたができないという意味ではありません (私はかなり下手なプログラマーです)。持っていると本当に便利なツールになるので、そうしてくれることを願っています。
(私の)参考のために、私がしたことを以下に文書化しました:
LOAD DATA INFILE
CREATE TABLE
主キーを除くすべての列を TEXT として使用LOAD DATA LOCAL INFILE
すべての CSV データを TEXT フィールドにロードします。PROCEDURE ANALYSE
ことができました。これは必要なものではありませんが、後で正規化に役立つことがわかりました。目玉 200 列は簡単でした。PhpMyAdmin の提案テーブル構造からの出力はジャンクでした。ALTER TABLE
PROCEDURE ANALYSE
ENUM
PROCEDURE ANALYSE
SELECT DISTINCT
主に列を使用し、INSERT
結果を分割してテーブルを分離する正規化をいくつか書きました。最初に FK の列を古いテーブルに追加しました。の直後に、INSERT
その ID を取得しUPDATE
、FK 列を編集しました。ループが終了したら、FK 列だけを残して古い列を削除しました。複数の従属列についても同様です。思ったよりずっと速かった。python manage.py inspctdb
し、出力を models.py にコピーしForeignkeyField
、FK が MyISAM に存在しないため、これらすべてを追加しました。python views.py、urls.py、いくつかのテンプレートを少し書きました...多田phpmyadmin を使用した迅速で汚い回避策: