2016-07-21 6 views
0

私はPythonスクリプトを使っていくつかのStataコマンドを生成しています。出力はテキストファイルです。私はPythonを使用して、現在のケースではない同じ観測に属する行をグループ化したいと思います。テキストファイルの行を並べ替える

このファイルの典型的な行は(のは、それをfile.txtを呼びましょう)ソートは次のとおりです。

、B、Cは、変数を識別している
[something something] if a == 1 & b == 2 & c == 3 & [other things] 

。 (a、b、c)の3つ組は、観測を一意に識別します。私がしようとしているのは、同じ観測に関連するすべての行をまとめてfile.txtを並べ替えることです。 (

replace k = 1 if a == 1 & b == 2 & c == 3 & comments_1 == "I wish I was better at Python" 


replace g = "Example" if a == 1 & b == 2 & c == 3 & comments_1 == "I wish I was better at Python" 


replace k = 2 if a == 1 & b == 3 & c == 4 & comments_1 == "" 

線1とが同じ観察に関連しているため、入力の3出力で互いに隣接している:

replace k = 1 if a == 1 & b == 2 & c == 3 & comments_1 == "I wish I was better at Python" 

replace k = 2 if a == 1 & b == 3 & c == 4 & comments_1 == "" 

replace g = "Example" if a == 1 & b == 2 & c == 3 & comments_1 == "I wish I was better at Python" 

に:

例えば、から行きます同じa、b、cトリプレット)。これはアルファベット順のソートとは異なり、sort()は使用できません。

私の計画は次のようになります。

は空の辞書dictを作成[タプル[int型]:設定を[STR]]

テキストファイルの各行を読みます。それぞれの行について、 'a =='の後と 'b =='の前に文字を検索して三つ組を取得します。

トリプレットが辞書に含まれている場合は、トリプレットが指し示すセット内の文字列としてその行を追加します。そうでない場合は、エントリを作成して文字列を追加します。

各エントリのセット内の各文字列について、ファイルに文字列を書き込みます。

これは私がファイルをソートすると信じています。

これは機能しますか?それを行うより良い方法はありますか?

ありがとうございます!

答えて

0

いいですね。あなたは正規表現を使って観測を抽出することができます。例えば、観測はあなたが使用することができ、正の整数で構成されていると仮定:

import re 
line = 'replace k = 1 if a == 1 & b == 2 & c == 3 & comments_1 == "test"' 
m = re.search(r'a == (\d+) & b == (\d+) & c == (\d+)', line) 
observation = tuple(map(int, m.groups())) 
print(observation) 

これはタプル(1, 2, 3)を印刷します。

0

これは良いアプローチですが、すべての行を保持したいので、同じトリプルで行をグループ化することはありません。すべての行のリストを作成し、その値をソートキーとしてトリプルで並べ替えます。

def getvalues(line): 
    """Extract a value triple from a line that matches the pattern""" 
    m = re.search(r"if a == (\d+) & b == (\d+) & c == (\d+) &", line) 
    if m: 
     return tuple(int(v) for v in m.groups()) 
    else: 
     return line # Lines that don't match the pattern are sorted normally 

with open("file.txt") as fp: 
    lines = fp.readlines() 

lines.sort(key=getvalues) 

上記

は、すべての行がない場合、あなたは正規表現を詳しく説明する必要がありますなど、同一の変数名、ホワイトスペースを、持っていることを前提としています。

関連する問題