2012-03-30 7 views
0

私はこのファイルを整理しようとしているx/y座標を持っています。ファイルには、各種の情報で構成されていますが、ライン内の同じ場所の座標と、次のように:私が欲しいものファイル内の特定の場所で同一の座標を削除する

IMPORTANT information 12213 1541515  COORDINATEX.COORDINATEY 
IMPORTANT assadad213114141 asdadad   COORDINATEX.COORDINATEY 
IMPORTANT assadad2ssss4141 asdadad   COORDINATEX.COORDINATEY 
IMPORTANT ass 141 asd135566666666d   COORDINATEX.COORDINATEY 

、座標(COORDINATEX.COORDINATEY)が同一と第一であるすべての行を削除しています重要とマークされた10文字は、最初の文字を除いて同じです。私はunixでsort -uを使ってみましたが、全体の行が同じでなければならないので、それはうまくいかず、ここではそうではありません。

例:

IMPORTANTLINE1 713)#!=%!3839413!"¤#(!¤! COORDINATEX.COORDINATEY1 
IMPORTANTLINE1 1339220"##"#"#"""""""""" COORDINATEX.COORDINATEY144 
IMPORTANTLINE1 fsafasdasd!38aaa!"¤#(!¤! COORDINATEX.COORDINATEY1 
IMPORTANTLINE1 713)#!=%!3839413!"¤#(!¤! COORDINATEX.COORDINATEY1 
IMPORTANTLINE2 sadasdasdadadadadadadada COORDINATEX.COORDINATE2 
IMPORTANTLINE2 sadasdasdadadadadadadada COORDINATEX.COORDINATE1 
IMPORTANTLINE2 sadasda333333333dadadada COORDINATEX.COORDINATE1 

は次のようになります。事前に

IMPORTANTLINE1 713)#!=%!3839413!"¤#(!¤! COORDINATEX.COORDINATEY1 
IMPORTANTLINE1 1339220"##"#"#"""""""""" COORDINATEX.COORDINATEY144 
IMPORTANTLINE2 sadasdasdadadadadadadada COORDINATEX.COORDINATE2 
IMPORTANTLINE2 sadasdasdadadadadadadada COORDINATEX.COORDINATE1 

感謝を!

+0

このファイルには何らかの構造がありますか?それらの座標は常に行の最後にあるか、\ tで区切られた列の数は同じですか?あなたの例から私は本当に分からないからです。 – Bogdan

+0

はい、座標は常に最後で、常に同じ長さです。 1,2、および144は、それらを異なるものにすることだけでしたが、私はそれがどうして私の質問を混乱させるかを見ることができます。申し訳ありません。 – niicepants

答えて

1

ファイルから読み込んだ行ごとに、重複を定義している部分を1つの文字列にします。セットに文字列が含まれているかどうかを確認し、文字列が出力されない場合はその文字列をセットに入れます。

+1

私はおそらく単一の文字列を作るのではなく、 'キー'の2つの部分のタプルを使用します。もっと自然な感じ。 – DSM

+0

@DSM、私にとっては、キーを単一のものにするのがより自然であると感じます。私はあなたが何を意味するかを見ます、それは私が推測する個人的な好みの問題です。もっとパフォーマンスが良いかどうか、あるいは検出可能な違いがあるかどうかはわかりません。 –

+0

@ MarkRansom:Pythonのタプルは、 "単なるもの"です - それはかなり素敵な言葉です。あなたはそれについてもっと学びたいと思っています - 文字列で区切られたものをグルーピングすることは、シーケンスとして扱うのは難しいでしょう。 – jsbueno

0

これは、それは私が考えるん:

import re 

data=''' 
IMPORTANTLINE1 713)#!=%!3839413!"#(!! COORDINATEX.COORDINATEY1 
IMPORTANTLINE1 1339220"##"#"#"""""""""" COORDINATEX.COORDINATEY144 
IMPORTANTLINE1 fsafasdasd!38aaa!"#(!! COORDINATEX.COORDINATEY1 
IMPORTANTLINE1 713)#!=%!3839413!"#(!! COORDINATEX.COORDINATEY1 
IMPORTANTLINE2 sadasdasdadadadadadadada COORDINATEX.COORDINATE2 
IMPORTANTLINE2 sadasdasdadadadadadadada COORDINATEX.COORDINATE1 
IMPORTANTLINE2 sadasda333333333dadadada COORDINATEX.COORDINATE1 
''' 
d={} 
data_out=[] 

for i,line in enumerate(data.split('\n')): 
    m=re.search(r'^(IMPORTANTLINE\d+).*(COORDINATEX)\.(COORDINATE(Y)?\d+)',line) 
    if m: 
     h=m.group(1)+m.group(2)+m.group(3) 
     if h not in d: 
      d[h]=i 
      data_out.append(line) 

for line in data_out: 
    print line 

出力:

IMPORTANTLINE1 713)#!=%!3839413!"#(!! COORDINATEX.COORDINATEY1 
IMPORTANTLINE1 1339220"##"#"#"""""""""" COORDINATEX.COORDINATEY144 
IMPORTANTLINE2 sadasdasdadadadadadadada COORDINATEX.COORDINATE2 
IMPORTANTLINE2 sadasdasdadadadadadadada COORDINATEX.COORDINATE1 
+0

すでに読み込まれた構造を保持するには、別の「セット」を使用する必要があります。長いリスト内の演算子「in」による検証は非常に高価であり、この問題をO(N log(N))からO(N²)に変換します。また、正規表現を使用する必要はありません。 – jsbueno

+0

@ jsbueno:実際には空白で区切られたフィールドが4つしかない場合、あなたのソリューションは良いです。しかし、私は辞書からセットへ行くことは、O(N log(N))からO(N 2)に行くことに同意しない。 [dictとセットのAlex Martelliのパフォーマンスの比較を参照してください](http://stackoverflow.com/a/1419324/298607)。彼らはキールックアップのためにほぼ同じです。 – dawg

1

SO、あなたは空白でseparatedfd行ごとに4つのフィールドを、持っています。 2番目のフィールドに - それはそれですか?

lines = [] 
found_lines = set() 
with open("mydatafile.dat", "rt") as data_file: 
    for line in data_file: 
     #avoid stopping on blank lines (usually the last line in the file is blank) 
     if not line.strip(): continue 
     # separate fields 
     imp, field1, x, y = line.split() 
     #separate significative chars in field1: 
     field1 = field1[1:10] # "first 10 chars, except first" 
     if (field1, x, y) in found_lines: 
      continue 
     found_lines.add(field1, x ,y) 
     lines.append(line) 
関連する問題