2016-12-16 4 views
0

私はPythonとpandasの新機能です。情報がある非常に大きなテキストファイル(200〜500 MB)を解析したいと思いますレコードとして表示され、各レコードは列ではなく行/行としてデータフィールドを含み、レコードは異なる数のデータを提供する(異なるデータタイプを提供する)。以下の例:Python-Pandas Parser for Textレコードが不均一な行数で配列されています

.... 
Record Type = Record_Name 
    attribute1 = 3090 (0x01218) 
    attribute2  = attribute_name3090 (type: type_name1) 
    timestamp: 21:47:33.360000 
    attribute4: 731001-1 (0x0b277911) 
    attribute5: 50000 (0x000000c350) 
    attribute6: 3934 (0x0000000f5e) 
    attribute7: 857 (0x0000000359) 
Record Type = Record_Name 
    attribute1 = 3099 (0x01227) 
    attribute2  = attribute_name3099 (type: type_name2) 
    timestamp: 21:49:07.359000 
    attribute4  = 731001-3 (0x0b277911) 
    attribute8: 14 (0x0000000e) 
    attribute9: 17 (0x00000011) 
    attribute10: 43 (0x0000002b) 
    attribute11: 40 (0x00000028) 
Record Type = Record_Name 
    attribute1 = 3090 (0x01218) 
    attribute2  = attribute_name3090 (type: type_name1) 
    timestamp: 21:51:17.142000 
    attribute4: 942101-2 (0x0b345872) 
    attribute5: 2490368 (0x00260000) 
    attribute6: 24 (0x00000018) 
    attribute7: 25 (0x00000019) 
Record Type = Record_Name 
    attribute1 = 3102 (0x) 
    attribute2  = attribute_name3102 (type: type_name1) 
    timestamp: 21:52:42.359000 
    attribute4: 731001-2 (0x0b277911) 
    attribute12: 0 (0x0000000000) 
    attribute13: 80 (0x0000000050) 
.... 

したがって、後処理のために、私は1つのレコードの特定のタイプをフィルタするレコードをまとめ、そして他のために、パンダのデータフレームの結合に所望のデータを抽出したいです。レコードの

DATAFRAME 1サマリー表: ()内で、各レコードの属性のみカップルを示すタイムスタンプによって索引付けデータフレームを作成し、すべての維持文字列形式BUT進値なし:

    attribute1 attribute2   type   attribute4 
timestamp 
... 
21:47:33.360000 3090  attribute_name3090 type_name1 731001-1 
21:49:07.359000 3099  attribute_name3099 type_name2 731001-3 
21:51:17.142000 3090  attribute_name3090 type_name1 942101-2 
21:52:42.359000 3102  attribute_name3102 type_name1 731001-2 
.... 

DATAFRAME 2 FILTERED RECORDS: attribute1 = 3090(type = typename1)に関連付けられたレコードのみをキャプチャし、タイムスタンプでアトリビュート5-7のインデックス付きインデックス付きインデックスデータを作成し、文字列から整数に変換します。

    attribute4 attribute5 attribute6 attribute7 
timestamp 
... 
21:47:33.360000 731001-1  5000   3934   857 
21:51:17.142000 942101-2  2490368  24   25 
.... 

ファイルを開いて行を読み込もうとしましたが、大量の時間がかかります。私は "ジェネレータ"について読んでいましたが、コードを単純化する方法を理解できませんでした。あなたの提案は非常に高く評価されます。 ありがとうございます。

のGus

+0

チェックこの回答:http://stackoverflow.com/questions/13651117/pandas-filter-lines-on-load-in-read-csv –

+0

こんにちはテッド、フィードバックに感謝。元のファイルはcsvではなく.txt(テキスト)なので、それはもっと挑戦的です。私はcsvファイルをパンダにロードし、それらのファイルで作業しています...この特定のケースでは、(1).txtを読み込み、(2)解析してpd.dataframesを2つ入れ、 3)出力をCSVに保存します。私の問題は(2)です。 Regrads、 –

+0

この[topic](http://stackoverflow.com/questions/19632075/how-to-read-file-with-space-separated-values)をご覧ください。 –

答えて

0

このコードは、簡単な方法で2つの辞書に入力ラインを解析する方法を示しています。入力が非常に規則的であると仮定します。メインアクションは、行がブランク上で分割され、コロンが削除され(データに何も存在しないと仮定して)、等号が削除された各行を読み込んだ直後です。 。

コードを実行すると、2つのテキストファイルが作成されます。各ファイルは、1行に1つの辞書で構成されています。

with open ('DF1.txt', 'w') as DF1: 
    with open ('DF2.txt', 'w') as DF2: 

     DF1_record = {} 
     DF2_record = {} 
     with open('bigText.txt') as bigText: 
      for inputLine in bigText: 
       inputLine = [_.replace(':', '') for _ in inputLine.strip().split()] 
       if '=' in inputLine: 
        inputLine.remove('=') 
       kind = inputLine[0] 
       if kind=='Record': 
        if DF1_record: 
         DF1.write(str(DF1_record)+'\n') 
        if DF2_record: 
         DF2.write(str(DF2_record)+'\n') 
         DF1_record={} 
         DF2_record={} 
        continue 
       if kind in ['attribute1', 'attribute2', 'attribute4', 'timestamp']: 
        if kind=='attribute2': 
         DF1_record[kind]=inputLine[1] 
         DF1_record['type']=inputLine[3][:-1] 
        else: 
         DF1_record[kind]=inputLine[1] 
       if kind in ['attribute1', 'attribute4', 'attribute4', 'attribute4', 'attribute7', 'timestamp']: 
        if DF1_record['attribute1']=='3090': 
         DF2_record[kind]=inputLine[1] 
関連する問題