2017-09-08 16 views
0

疎な行列を(テキストファイルから)JSON形式(HTML表を解析する方がずっと簡単です)に変換する方法を探しています。私が持っていなければ車輪を再発明しようとしていないので、既にそこにあるライブラリがあれば、私に知らせてください!Python - 疎行列をJSONに変換する

最初の数字は常に1または0です(真または偽の場合、すべての値は空白で区切られ、コロンの前の数字で列/インデックスが示されます)。

1 1:2 3:1 
1 2:3 

は君たちが入力を理解しやすくするために、以下のゼロ値と列見出しが含まだけで、同じ入力である:(JSONで)

Flag Col1 Col2 Col3 Col4 Col5 
1  1:2 2:0 3:1 4:0 5:0 
1  1:0 2:3 3:0 4:0 5:0  

優先出力:

[ 
    { 
      Flag: "1", 
      Col1: "2", 
      Col2: "0", 
      Col3: "1", 
      Col4: "0", 
      Col5: "0", 
     } 
    { 
      Flag: "1", 
      COl1: "0", 
      Col2: "3", 
      Col3: "0", 
      COl4: "0", 
      Col5: "0", 
     } 
] 

答えて

1

私はこのコードはあなたの問題を解決することができると思う:

import json 

with open('matrix.txt') as f: 
    content = [x.strip() for x in f.readlines()] 
    result = [] 
    for line in content: 
     elems = line.split(' ') 
     D = {x[0]:int(x[2]) for x in elems[1:]} 
     row = {"Col"+str(i):D.get(str(i),0) for i in range(1,6)} 
     row["Flag"] = int(elems[0]) 
     result.append(row) 
    print(json.dumps(result, indent=4)) 

は、あなたの行列は、各ラインのためにあなたはフラグ値を取得し、ペア(列、値)の辞書を作成し、ファイルmatrix.txtであることを考慮します。次に、可能な列の範囲を反復処理して、i番目の列の辞書値(見つからなければ0)を取得するのは簡単です。ここで私は行列が常に5列を持っていると仮定し、そうでなければrangeを変更します。

最後に、jsonライブラリを使用して、生成されたすべてのデータを変換することができます。 indentパラメータは、出力を「あらかじめ確認」し、読みやすくするために使用されます。最終コードで使用する必要はありません。

+0

ありがとうございます、これは機能します!私が持っている不満は、列が出力の降順であることです(つまり、Col5が最初で、Flagが最後です)。しかし、かなり簡単に修正する必要があります... – RThomP

+0

私が得る出力は正しく順序付けられていますが、 'sort_keys = True'を' json.dumps'に追加しようとします。いずれにしても、JSONオブジェクトは順序を保証していないことに注意してください。 [公式仕様](http://www.json.org/)から:_anオブジェクトは、名前と値のペアの順序付けられていないセットです。 – stjernaluiht

1
import json 

def convertMatrix(file_name): 
    final_list = [] 
    try: 
     with open(file_name, "r") as sparse_mat: 
      matrix = sparse_mat.readlines() 

     for row in matrix: 
      each_dct = {} 
      row_vals = row.rstrip("\n").split() 

      if row_vals: 
       each_dct["Flag"] = row_vals[0] 
       for col_elem in row_vals[1:]: 
        if ":" in col_elem: 
         each_col_val = col_elem.split(":") 
         column_name = "Col"+each_col_val[0] 
         column_val = str(each_col_val[1]) 
         each_dct[column_name] = column_val 
       final_list.append(each_dct) 
    except Exception as e: 
     print "Exception occured", e 

    return final_list 


print convertMatrix("demo.text") 

この関数を使用すると、jsonを取得できます。あなたが質問したようにテキストファイル名を渡してください。

+0

これは技術的には機能しますが、テキストファイルを取得してJSONテーブルに解析するので、(その列番号の値が見つからない場合はゼロ値を生成することによって)目的の出力を生成しません。 – RThomP

+0

私はあなたのi/pと希望の出力を教えてくれますか?私はそれが私のために働いているのを試みました。 –

+0

入力と出力がOPにあります... – RThomP

関連する問題