查找和编辑文本文件

时间:2016-08-24 05:20:39

标签: python replace vbscript automation find

我正在寻找是否有办法让这个过程自动化。基本上我每天需要下载300,000行数据。在将数据上传到SQL之前,需要编辑几行。

Jordan || Michael | 23 | Bulls | Chicago

Bryant | Kobe ||| 8 || LA

我想要完成的是每行只有4个垂直条。通常,我会搜索关键字,然后手动编辑然后保存。这两个是我数据中唯一的异常。

  1. 找到"乔丹",然后删除多余的1个竖线" |"就在它之后。
  2. 我需要找到" Kobe",然后移除两个多余的竖条" |"就在它之后。
  3. 正确的格式如下 -

    Jordan | Michael | 23 | Bulls | Chicago
    
    Bryant | Kobe | 8 || LA
    

    不确定是否可以在vbscript或Python中完成此操作。 任何帮助,将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:2)

可以使用Python或vbscript,但它们对于这么简单的事情来说太过分了。试试sed

$ sed -E 's/(Jordan *)\|/\1/g; s/(Kobe *)\| *\|/\1/g' file 
Jordan | Michael | 23 | Bulls | Chicago
Bryant | Kobe | 8 || LA

要保存到新文件:

sed -E 's/(Jordan *)\|/\1/g; s/(Kobe *)\| *\|/\1/g' file >newfile

或者,要就地更改现有文件:

sed -Ei.bak 's/(Jordan *)\|/\1/g; s/(Kobe *)\| *\|/\1/g' file 

如何运作

sed逐行读取和处理文件。在我们的例子中,我们只需要具有s/old/new/g形式的substitute命令,其中old是正则表达式,如果找到,则由new替换。命令末尾的可选g告诉sed执行替换命令'全局',这不仅意味着一次,而且意味着在线上显示的次数。

  • s/(Jordan *)\|/\1/g

    这告诉sed寻找Jordan,然后是零个或多个空格,然后是一个垂直条,然后移除垂直条。

    更详细地说,(Jordan *)中的parens告诉sed保存字符串Jordan,然后将零或多个空格作为一组保存。在替换方面,我们将该组引用为\1

  • s/(Kobe *)\| *\|/\1/g

    同样地,这告诉sed寻找Kobe后跟零个或多个空格后跟一个垂直条并删除垂直条。

使用python

使用与上面相同的逻辑,这是一个python程序:

$ cat kobe.py
import re
with open('file') as f:
    for line in f:
        line = re.sub(r'(Jordan *)\|', r'\1', line)
        line = re.sub(r'(Kobe *)\| *\|', r'\1', line)
        print(line.rstrip('\n'))
$ python kobe.py
Jordan | Michael | 23 | Bulls | Chicago
Bryant | Kobe | 8 || LA

将其保存到新文件:

python kobe.py >newfile

答案 1 :(得分:1)

我在Python 3.5中编写了一段代码片段如下。

# -*- coding: utf-8 -*-

rows = ["Jordan||Michael|23|Bulls|Chicago",
        "Bryant|Kobe|||8||LA"]

keywords = ["Jordan", "Kobe"]        

def get_keyword(row, keywords):
    for word in keywords:
        if word in row:
            return word
    else:
        return None            

for line in rows:
    num_bars = line.count('|')
    num_bars_del = num_bars - 4  # Number of bars to be deleted
    kw = get_keyword(line, keywords)
    if kw:  # this line contains a keyword
        # Split the line by the keyword
        first, second = line.split(kw)
        second = second.lstrip()
        result = "%s%s%s"%(first, kw, second[num_bars_del:])
        print(result)