我有很多统一行的文本文件,我想加载到mysql数据库中,但文件并不完全一致。一些杂项信息的开头有几行,每6行有一些时间戳。
由于我的文件格式,“LOAD DATA INFILE”似乎不是答案。它似乎不够灵活。
注意:文件的标题占用预定的行数。时间戳是可预测的,但还有一些其他随机注释可以弹出,需要忽略。它们总是从我可以检查的几个关键字开始。
我中间档案的样本:
103.3 .00035
103.4 .00035
103.5 .00035
103.6 .00035
103.7 .00035
103.8 .00035
103.9 .00035
Time: 07-15-2009 13:37
104.0 .00035
104.1 .00035
104.2 .00035
104.3 .00035
104.4 .00035
104.5 .00035
104.6 .00035
104.7 .00035
104.8 .00035
104.9 .00035
Time: 07-15-2009 13:38
105.0 .00035
105.1 .00035
105.2 .00035
由此我需要将信息加载到三个字段中。第一个字段需要是文件名,另一个字段必须是示例。我可以将文件名添加到每个数据行的前面,但如果我使用脚本加载数据,则可能不需要这样做。
如果需要,我可以更改文件格式,但我不想丢失时间戳和标题信息。
SQLAlchemy似乎是python的一个可能的好选择,我非常熟悉。
我有数千行数据,因此加载我已经拥有的所有文件起初可能会很慢,但之后,我只想加载文件的 new 行。因此,我需要对我加载的内容进行选择,因为我不想要重复的信息。
有关从文本文件到mysql数据库的选择性数据加载方法的任何建议吗? 除此之外,你建议只加载数据库中尚未存在的文件行?
谢谢大家。与此同时,我会更多地研究一下SQLAlchemy,然后看看我是否能够得到它。
答案 0 :(得分:2)
LOAD DATA INFILE有一个IGNORE LINES选项,可用于跳过标题。根据{{3}},它还有一个“LINES STARTING BY'prefix_string'”选项,您可以使用它,因为所有数据行似乎都以两个空格开头,而您的时间戳从行的开头开始。 / p>
答案 1 :(得分:2)
另一种方法是让Python为您转换文件。您可以根据您指定的条件轻松地将输入文件过滤到输出文件。此代码假定您有一些函数is_data(line),它检查行指定的条件,如果是数据则返回true。
with file("output", "w") as out:
for line in file("input"):
if is_data(line):
out.write(line)
此外,如果您的文件只是继续连接,您可以让它存储并读取最后记录的偏移量(此代码可能不是100%正确,我没有测试它。但是你明白了):
if os.path.exists("filter_settings.txt"):
start=long(file("filter_settings.txt").read())
else:
start=0
with file("output", "w") as out:
input = file("input")
input.seek(start)
for line in input:
if is_data(line):
out.write(line)
file("filter_settings.txt", "w").write(input.tell())