2015-02-08 72 views
0

愛Python,我也是Python的新手。在社區(Antti Haapala等用戶)的幫助下,我能夠在一定程度上進行。但我最終陷入了困境。請幫忙。在進入我的大數據POC之前,我還有兩項任務尚未完成。 (計劃在超過100萬條記錄在文本文件中使用此代碼)關鍵詞搜索只是在文件的一列中,並在關鍵詞前後保留2個字

•在搜索欄的關鍵字(C#3),並保持2個字前面和後面該關鍵詞。

•將打印輸出轉移到文件。

•在這裏我不想碰C#1,C#2參照完整性的目的。

非常感謝您的幫助。

我的輸入文件:

C#1 C# 2 C# 3 (these are headings of columns, I used just for clarity) 
12088|CITA|{Hello very nice lists, better to keep those 
12089|CITA|This is great theme for lists keep it 

所需的輸出文件:(只在第3列或最後一列更改)

12088|CITA|very nice lists, better to 
12089|CITA|theme for lists keep it 

代碼我目前正在使用:

s = """12088|CITA|{Hello very nice lists, better to keep those 
12089|CITA|This is great theme for lists keep it """ 
for line in s.splitlines(): 
    if not line.strip(): 
     continue 
    fields = line.split(None, 2) 
    joined = '|'.join(fields) 
    print(joined) 

BTW如果我使用關鍵字搜索,我正在查看我的第一和第二列。我的挑戰是保持第一和第二列不變。並且只搜索第3列並在關鍵詞/之前/之前保留2個單詞。

+0

爲什麼你不分裂的' '|'',如果這是你的列分隔符? – 2015-02-08 19:49:59

+0

什麼是關鍵詞?這是「列表」,對嗎?你爲什麼不在你的代碼中使用它? – 2015-02-08 19:54:13

+0

我必須拆分,因爲我必須分開3列,並且僅在第3列中進行搜索。我不想在第1或第2欄中搜索。我只想在第三列中搜索。 (在第3列中搜索詞前後加上2個關鍵詞)。這有道理嗎? – Murali 2015-02-08 19:57:24

回答

0

還存在一些問題,大概還剩你努力究竟如何進行關鍵字搜索。你的例子中已經包含了一個障礙:如何處理諸如逗號之類的字符?此外,不清楚如何處理不包含關鍵字的行。另外,如果前面沒有兩個單詞或關鍵字後面有兩個單詞,該怎麼辦?我想你自己對於確切的要求有些不確定,並沒有考慮所有的邊緣情況。

不過,我已經對這些問題有些「盲目決策」,這裏是一個簡單的例子實現,假設您的關鍵字匹配規則是相當簡單的。我創建了功能findword(),您可以根據自己的喜好進行調整。所以,也許這個例子可以幫助你找到自己的要求。

KEYWORD = "lists" 

S = """12088|CITA|{Hello very nice lists, better to keep those 
12089|CITA|This is great theme for lists keep it """ 


def findword(words, keyword): 
    """Return index of first occurrence of `keyword` in sequence 
    `words`, otherwise return None. 

    The current implementation searches for "keyword" as well as 
    for "keyword," (with trailing comma). 
    """ 
    for test in (keyword, "%s," % keyword): 
     try: 
      return words.index(test) 
     except ValueError: 
      pass 
    return None 


for line in S.splitlines(): 
    tokens = line.split("|") 
    words = tokens[2].split() 
    idx = findword(words, KEYWORD) 
    if idx is None: 
     # Keyword not found. Print line without change. 
     print line 
     continue 
    l = len(words) 
    start = idx-2 if idx > 1 else 0 
    end = idx+3 if idx < l-2 else -1 
    tokens[2] = " ".join(words[start:end]) 
    print '|'.join(tokens) 

測試:

$ python test.py 
12088|CITA|very nice lists, better to 
12089|CITA|theme for lists keep it 

PS:我希望我得到的指數適合切片。不過,你應該檢查一下。

+0

工作得很好。是否可以添加其他關鍵字?而且,如果第3列有任何特殊字符,如「{」,「\」,「...」等程序完全跳過第1列和第2列。實際上我不需要那些角色。有沒有辦法在執行程序之前清理文件第3列? – Murali 2015-02-09 05:33:30

+0

我也收到「IndexError:列表索引超出範圍」錯誤。請幫忙 – Murali 2015-02-09 06:38:02

1

首先,我要提醒你,使用此代碼爲100萬次的記錄是很危險的。你正在處理正則表達式,只要表達式是正則表達式,這種方法是很好的。否則,您最終可能會創建大量案例來提取所需的數據,而無需提取不想要的數據。

100萬案件for循環太慢,你需要的大熊貓。

import pandas as pd 
import re 
df = pd.DataFrame({'C1': [12088 
,12089],'C2':["CITA","CITA"],"C3":["Hello very nice lists, better to keep those", 
            "This is great theme for lists keep it"]}) 
df["C3"] = df["C3"].map(lambda x: 
         re.findall('(?<=Hello)[\w\s,]*(?=keep)|(?<=great)[\w\s,]*', 
            str(x))) 
df["C3"]= df["C3"].map(lambda x: x[0].strip()) 
df["C3"].map(lambda x: x.strip()) 

這給

df 
     C1 C2       C3 
0 12088 CITA very nice lists, better to 
1 12089 CITA  theme for lists keep it