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のみを印刷するため、すべての行に同じ列があるとします。