【发布时间】:2016-07-17 10:10:48
【问题描述】:
我有很多非常大的文件。
每个文件都包含这样的行:
uuid1 (tab) data1 (vtab) data2 ... dataN
uuid2 (tab) data1' (vtab) data2' (vtab) data3' (vtab) ... dataN'
....
每行的 N 都不同。结果需要如下所示:
uuid1 (tab) data1
uuid1 (tab) data2
....
uuid1 (tab) dataN
uuid2 (tab) data1'
uuid2 (tab) data2'
uuid2 (tab) data3'
...
uuid2 (tab) dataN'
....
我有一个可以完成这项工作的正则表达式,替换:
^([abcdef0123456789]{8}-[abcdef0123456789]{4}-[abcdef0123456789]{4}-[abcdef0123456789]{4}-[abcdef0123456789]{12})\t(.+?)\x0B
与:
\1\t\2\n\1\t
但它很慢,显然需要重复应用。
是否有更快的编程方式在所有文件中执行此操作?
工具箱中可用的工具:unix 工具(sed、awk 等)、python,可能还有 perl。
不求宗教战争,只求务实。
其他信息
这是我使用的完整脚本,基于 Kristof 的脚本,用于处理外循环:
#!/usr/bin/python
import os
import uuid
def processFile( in_filename ):
out_filename = os.path.splitext(in_filename)[0] + '.result.txt'
with open(in_filename) as f_in:
with open(out_filename, 'w') as f_out:
for line in f_in:
try:
# Retrieve the line and split into UUID and data
line_uuid, data = line.split('\t')
# Validate UUID
uuid.UUID(line_uuid)
except ValueError:
# Ignore this line
continue
# Write each individual piece of data to a separate line
for data_part in data.rstrip().split('\x0b'):
f_out.write(line_uuid + '\t' + data_part + '\n')
for i in os.listdir(os.getcwd()):
if i.endswith(".txt"):
print i
processFile( i )
continue
else:
continue
【问题讨论】:
标签: python regex awk sed data-cleaning