我正在寻找是否有办法让这个过程自动化。基本上我每天需要下载300,000行数据。在将数据上传到SQL之前,需要编辑几行。
Jordan || Michael | 23 | Bulls | Chicago
Bryant | Kobe ||| 8 || LA
我想要完成的是每行只有4个垂直条。通常,我会搜索关键字,然后手动编辑然后保存。这两个是我数据中唯一的异常。
正确的格式如下 -
Jordan | Michael | 23 | Bulls | Chicago
Bryant | Kobe | 8 || LA
不确定是否可以在vbscript或Python中完成此操作。 任何帮助,将不胜感激。谢谢!
答案 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程序:
$ 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)