データを列に変換

データを列に変換
 AC=126;AC_AFR=0;AC_AMR=0;AC_Adj=126;AC_EAS=120;AC_FIN=0;AC_Het=112;
 AC=12683;AC_AFR=4578;AC_AMR=559;AC_Adj=12680;AC_EAS=2104;AC_FIN=501;AC_Het=91966

私のデータの列の1つであるキーと値は次のとおりです。選択したデータをヘッダーが列のキーと値である列に変換したいと思います。

すべての行に同じデータがあるわけではありません。一部の行には他の行に表示されるフィールドがありません。

希望の出力:

AC      AC_AFR    AC_AMR and so on
126     0         0
12683   4578      559

これを行う方法や開始位置がわかりません。

ベストアンサー1

問題は、データが最初の行が列名で、残りの行が行ごとの列データである単純なCSVタイプファイルではないことです。

;これには、文字で区切られたcolumn_name = column_dataがあります。私の解決策は、Pythonのような言語を使用してファイルを1行ずつ読み込むことでした。各行にdict()を作成し、各フィールドにK:Vペアを作成します。次に、その辞書をすべての行のlist()に追加します。

これを行ったら、リストを操作できます。最初の行にある場合は列名を印刷し、値を印刷し、そうでない場合は値のみを印刷します。

どの言語を使用しても、アプローチは似ていると思いますが、確かに可能です。

以下は、「列」の順序を維持するためにOrderedDictsを使用するPythonの簡単な例です。

#!/usr/bin/python
''' a quick example of a script to parse '=' delimited fields in 
    ';' delimited columns of a text file.
    prints tab delimited columnar data with headers to STDOUT
'''
from collections import OrderedDict

with open('data', 'rb') as infile:
    FLINES = infile.read().split()

DATA = []
for line in FLINES:
    fields = line.split(';')
    d = OrderedDict()
    for field in fields:
        if '=' in field:
            col, value = field.split('=')
            d.update({col: value})
    DATA.append(d)

L = 0
for D in DATA:
    if L == 0:
        print '\t'.join(D.keys())
    print '\t'.join(D.values())
    L += 1
  • この例では、リストから取得した最初の項目のcol_nameのみを印刷するため、すべての行に同じ列があるとします。

おすすめ記事