2016-05-31 11 views
-1

SQLテーブルにはいくつかのデータが用意されていますが、いくつかのルールに従って変換する必要があります。 しかし、この変換では列名を動的にアドレス指定する必要があります。つまり、値を格納する列の名前自体が他の列などに値として格納されます。 また、値が異なる列の範囲に存在するかどうかによって、 1つの入力行に対して複数の出力行を生成する必要があるので、これは一種の転置です。csvデータの処理と転置のためのスクリプト言語の選択

私は、例を用いてそれを示してみましょう:

id | targetColumnName | col1 | col2 | col3 | col4 
----------------------------------------------------- 
1    foo    5 
2    foo  7   42 
3    bar    3    6 
4    foo     5 
5    bar 
6    bar     2  12 

これは次のように生成しなければならない:

すなわち
id | foo | bar 
-------------- 
1  5 
2  7 
2 42 
3   3 
3   6 
4  5 
6   2 
6   12 

は、COLX列のいずれかの各現在値のため、出力を生成しますその値をtargetColumnName列で指定された列に追加します。

これは、SQLを全く使用することは、少なくとも単純なクエリを作成することではないと考えています。複合ステートメント/ストアドプロシージャを作成することはおそらく可能ですが、依然として私にとっては間違ったツールのようです。

私はデータもCSV形式ですが、テキスト操作機能を備えた強力なスクリプト言語が仕事に適していると感じていますが、私はPythonの表面を傷つけただけです。私はPerlを知らないちょっとしたawkしかありません。 私はJavaでそれを取り除くことができると知っていますが、これはPythonの魅力的な1ライナーでやっている気がします。 :)

質問が本質的に1)SQL(ite)でこれを行うことは妥当であり、2)他のツールはどんなに良いでしょうか?

+1

これは良い質問ではありません。誰もが別にそれに答えることができる、私はストアドプロシージャのアプローチを好むだろう、他の誰かがJavaアプリケーションを書くだろう。あなたはそのような質問に対して明確な答えを得ることはできません。 – tafa

+0

私はJavaソリューションを求めていません。私はそれを自分で行うことができます。どの言語が良い言語になっているか聞いてみることができますが、私は単に「どちらが最善か」と尋ねるだけではなく、この種の処理に適した言語がどの言語に組み込まれているかを尋ねています。 – JHH

答えて

1

1行ではありませんが、これはPython(*)では比較的簡単です。標準ライブラリのcsvモジュールはあなたの友人です。

対象の列名が不明で、ファイルがメモリに読み込まれることが多いと仮定すると、可能なすべての列名を取得するためにCSVを1回読み込み、2回目に実際の変換を実行する必要があります。ここで

は、いくつかの擬似コードです:

import csv 

fieldnames = set('id') 
with open('in.csv', 'rb') as csvfile: 
    reader = csv.reader(csvfile) 
    for row in reader: 
     fieldname = row[1] 
     fieldnames.add(row[1]) 
fieldnames = sorted(fieldnames) 

with open('in.csv', 'rb') as csvfile: 
    reader = csv.reader(csvfile) 
    with open('out.csv', 'w') as outfile: 
     writer = csv.DictWriter(outfile, fieldnames=fieldnames) 
     for row in reader: 
      id_ = row[0] 
      fieldname = row[1] 
      for field in row[2:]: 
       if field: 
        writer.writerow({'id': id_, fieldname: field}) 

あなたはCSVの方言に依存csv.readerにいくつかのパラメータを微調整する必要がある場合があります。

(*)17空でない行:

+0

これは非常に有望に見える、私はそれを試してみましょう。ありがとう! – JHH

関連する問題