2015-02-08 40 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