6

Excel(またはCSV)ファイルを検査するMYSQLテーブルスキーマを作成するにはどうすればよいですか。タスク用の準備ができている Python ライブラリはありますか?

列ヘッダーは列名にサニタイズされます。データ型は、スプレッドシートの列の内容に基づいて推定されます。完了すると、データがテーブルにロードされます。

正規化を開始したい ~200 列の Excel ファイルがあります。

4

5 に答える 5

3

xlrdモジュールを使用します。ここから始めてください。[免責事項: 私は著者です]。xlrdセルをテキスト、数値、日付、ブール値、エラー、空白、および空に分類します。セルに関連付けられた形式を調べることによって、日付と数値を区別します (例: "dd/mm/yyyy" と "0.00")。

ユーザーが入力したデータを調べて、各列に使用する DB データ型を決定するコードをプログラミングする作業は、簡単に自動化できるものではありません。データを目で見て、整数、お金、テキスト、日付、日時、時刻などの型を割り当て、推測を確認するコードを記述できるはずです。テキストフィールドに入力された数値や日付データなどに対処できる必要があることに注意してください(GUIでは問題ないように見えます)。「推定」データ型に適合しないセルを処理する戦略が必要です。データを検証してクリーニングする必要があります。テキスト文字列を正規化してください (先頭/末尾の空白を削除し、複数の空白を単一のスペースに置き換えます。Excel テキストは (BMP のみ) Unicode です。ASCII または "ANSI" に変換しないでください。Unicode で作業し、エンコードします。 UTF-8 を使用してデータベースに配置します。

于 2010-06-18T23:06:47.383 に答える
1

私の知る限り、このプロセスを自動化できるツールはありません (以前にこの問題が発生したことがあるので、誰かが私が間違っていることを証明してくれることを願っています)。これを行ったとき、2 つのオプションを思いつきました。
(1) db に適切な型の列を手動で作成してからインポートするか、
(2) 列のデータ型を「把握」できる何らかの種類のフィルターを作成します。する必要があります。私が最初のオプションを選択した主な理由は、型推論を実行するプログラムを実際に作成できるとは思わなかったからです。
型推論ツール/変換を作成することにした場合は、対処する必要がある可能性があるいくつかの問題があります。
(1) Excel の日付は、実際には 1899 年 12 月 31 日からの日数として保存されます。列が数値データ (たとえば、人口) ではなく日付であるとどのように推測できますか?
(2) テキスト フィールドの場合、varchar(n) 型 (n はその列の最長のエントリ) の列を作成するだけですか、それともエントリの 1 つが上限よりも長い場合は無制限の char フィールドにしますか? もしそうなら、良い上限は何ですか?
(3) どのようにして浮動小数点数を正しい精度で小数点以下に自動的に変換し、桁を失うことはありませんか?
明らかに、これはあなたができないという意味ではありません (私はかなり下手なプログラマーです)。持っていると本当に便利なツールになるので、そうしてくれることを願っています。

于 2010-06-18T18:10:02.593 に答える
1

(私の)参考のために、私がしたことを以下に文書化しました:

  1. XLRDは実用的ですが、ExcelデータをCSVとして保存したので、使用できますLOAD DATA INFILE
  2. ヘッダー行をコピーし、インポートおよび正規化スクリプトの作成を開始しました
  3. スクリプトは次のことを行います:CREATE TABLE主キーを除くすべての列を TEXT として使用
  4. mysql のクエリ:LOAD DATA LOCAL INFILEすべての CSV データを TEXT フィールドにロードします。
  5. の出力に基づいて、列に適切な型と長さを与えるPROCEDURE ANALYSEことができました。これは必要なものではありませんが、後で正規化に役立つことがわかりました。目玉 200 列は簡単でした。PhpMyAdmin の提案テーブル構造からの出力はジャンクでした。ALTER TABLEPROCEDURE ANALYSEENUMPROCEDURE ANALYSE
  6. SELECT DISTINCT主に列を使用し、INSERT結果を分割してテーブルを分離する正規化をいくつか書きました。最初に FK の列を古いテーブルに追加しました。の直後に、INSERTその ID を取得しUPDATE、FK 列を編集しました。ループが終了したら、FK 列だけを残して古い列を削除しました。複数の従属列についても同様です。思ったよりずっと速かった。
  7. (django) を実行python manage.py inspctdbし、出力を models.py にコピーしForeignkeyField、FK が MyISAM に存在しないため、これらすべてを追加しました。python views.py、urls.py、いくつかのテンプレートを少し書きました...多田
于 2010-07-02T23:42:26.803 に答える
1

phpmyadmin を使用した迅速で汚い回避策:

  • 適切な数の列を含むテーブルを作成します。データが列に収まっていることを確認してください。
  • CSV をテーブルにインポートします。
  • 提案されたテーブル構造を使用します。
于 2010-06-18T15:41:40.290 に答える
0

Pandasはスキーマを返すことができます:

pandas.read_csv('data.csv').dtypes

参考文献:

于 2018-01-31T15:35:12.767 に答える