2017-11-22 26 views
-1

私はDjangoベースのWebアプリケーションで作業しています。PostgreSQLにCSVをインポート

100,000行以上あるcsv-postgresqlデータベースをインポートし、Djangoアプリケーションのデータベースとして使用します。 ここでは、私は2つの問題に直面しました。私は、CSVファイルをインポートするには、PostgreSQLデータベースのフィールド名を定義する必要がありますどのように、

%oil, %gas, up/down, CAPEX/Cash-flow, D&C Cape,... 

第一: フィールド名は、このような特殊文字が含まれて?

第2回、インポート後、私はdjangoモデルでデータを取得します。次に、特殊文字を含むDjangoモデルの変数名をどのように定義できますか?

もちろん、特殊文字を含むcsvの列名を変更することはできますが、変更する必要はありません。何も変更せずに元のCSVをインポートしたい。

この問題を解決するための解決策はありますか?

+0

「コピー」を使用すると、コンテンツ名が同じであれば、列名を指定する必要はありません。 – Hambone

+0

ありがとう@ハンボーン。しかし、私はそれが正しい解決だとは思わない。 – Deimos620

+0

あなたは少なくともそれを失格にする前に、@ Hamboneの提案を試してください。彼の提案は良いです。 – Borut

答えて

1

例には特殊文字はありません。少なくとも、Pythonやデータベースの観点からは問題はありません。

まず、疑わしいフィールド名は避けてください。特に金融では避けてください。 %oilは、オイルシェア、オイルマージン、または他の何かを意味することができます。そして、あなたは@Hamboneが示唆したようにCSVからデータをインポートするcopyを使用

class FinancialPeformanceData(models.Model): 

    oil_share = models.DecimalField(max_digits=5, decimal_places=2) 
    gas_share = models.DecimalField(max_digits=5, decimal_places=2) 
    growth = models.DecimalField(max_digits=10, decimal_places=2) 
    capex_to_cf = models.DecimalField(max_digits=7, decimal_places=2) 
    ... etc. 

のように意味のある名前を持つモデルを定義します。 CSVファイルにヘッダーは必要ありません。

def import_csv(request): 

    file = './path/to/file' 
    with open(file, 'rb') as csvfile: 
      with closing(connections['database_name_from_settings'].cursor()) as cursor: 
       cursor.copy_from(
        file=csvfile, 
        table='yourapp_financialperformancedata', #<-- table name from db 
        sep='|', #<-- delimiter 
        columns=(
         'oil_share', 
         'gas_share', 
         'growth', 
         'capex_to_cf', 
         ... etc. 
        ), 
      ) 

    return HttpResponse('Done!') 
+0

素晴らしい!ありがとう。これは私を助けた。 – Deimos620

+0

あなたはおそらく最初に動作することはありませんが、それに固執します。それはできます。 CSVにヘッダーがあると、私の例はうまくいかないでしょう。私はこのように何百万行ものCSVをインポートしています。 – Borut

+0

ありがとうございます。最初はヘッダーも解析されていると思っていました。だから、私は構文解析が問題で、@ hamboneのものを拒否したと思うのです。 – Deimos620

関連する問題