我有一系列大的平面文本文件,我需要解析才能插入到SQL数据库中。每条记录跨越多行,由大约一百个固定长度的字段组成。我试图弄清楚如何有效地解析它们而不将整个文件加载到内存中。
每个记录以数字“1”作为新行的第一个字符开始(尽管不是每行以“1”开头的是新记录)并且稍后用一系列20个空格终止多行。虽然每个字段都是固定宽度的,但每个记录都是可变长度的,因为它可能包含也可能不包含多个可选字段。所以我一直使用"...20 spaces...\n1"
作为记录分隔符。
我一直在尝试使用这样的东西来一次处理1kb:
def read_in_chunks(file_object, chunk_size):
while True:
data = file_object.read(chunk_size)
if not data:
break
yield data
file = open('test.txt')
for piece in read_in_chunks(file, chunk_size=1024):
# Do stuff
但是,我遇到的问题是当一条记录跨越多个块时。我是否忽略了明显的设计模式?这个问题似乎有点普遍。谢谢!
答案 0 :(得分:3)
def recordsFromFile(inputFile):
record = ''
terminator = ' ' * 20
for line in inputFile:
if line.startswith('1') and record.endswith(terminator):
yield record
record = ''
record += line
yield record
inputFile = open('test.txt')
for record in recordsFromFile(inputFile):
# Do stuff
BTW,file
是一个内置函数。改变它的价值是不好的风格。