2012-03-30 51 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 2012-03-30 14:49:41

+0

是的,座標始終是最後一個,總是相同的長度。 1,2和144只是爲了讓他們不同,但我可以看到這是如何搞砸我的問題。對於那個很抱歉。 – niicepants 2012-03-30 15:16:23

回答

1

對於從文件中讀取的每一行,取出定義重複的部分並將它們拼成單個字符串。檢查一個集合以查看它是否包含字符串,如果它不包含,則將該行寫入輸出並將該字符串放入集合中。

+1

我可能會使用'key'兩部分的元組而不是單個字符串。感覺更自然。 – DSM 2012-03-30 14:54:46

+0

@DSM,對我來說,讓鑰匙成爲單一事物感覺更自然。我明白你的意思,但我想是個人喜好的問題。我不確定哪個性能更高,或者即使有可檢測的差異。 – 2012-03-30 14:57:51

+0

@MarkRansom:Python中的一個元組,它是一個「單一的東西」 - 它是一個非常好的語言,我想你想了解更多關於它的東西 - 將字符串中分離出來的東西粘在一起,那麼作爲一個序列將很難處理。 – jsbueno 2012-03-30 18:38:00

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

你應該使用一個單獨的「set」來保持已經讀取的結構。長列表中的操作符「in」的驗證非常昂貴,並將此問題從O(N log(N))轉換爲O(N 2)。此外,不需要使用正則表達式 – jsbueno 2012-03-30 18:41:02

+0

@jsbueno:如果實際上只有4個字段由空格分隔,則您的解決方案很好。然而,我不同意從字典到集合將從O(N log(N))到O(N 2)。 [看看Alex Martelli在字典和集合之間的性能比較](http://stackoverflow.com/a/1419324/298607)。對於重要的查詢,它們大致相同。 – dawg 2012-03-30 19:59:34

1

所以,你必須每行四個字段,由空格separatedfd。在第二個領域 - 是嗎?

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) 
相關問題