2009-07-28 89 views
0

我有很多统一行的文本文件,我想加载到mysql数据库中,但文件并不完全一致。在开始处有几行用于一些其他信息,并且每6行有时间戳。从txt文件加载非均匀数据到msql数据库

由于我的文件格式,“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的一个可能的好选择,我很熟悉。

我有成千上万行的数据,因此加载我已有的所有文件可能起初速度较慢,但​​此后,我只想加载新文件的行。所以,我需要对我加载的内容进行选择,因为我不想要重复的信息。

关于从文本文件到mysql数据库的选择性数据加载方法的任何建议? 而且,除此之外,对于仅在数据库中尚未存在的文件行中加载,您有什么建议?

谢谢大家。同时,我会更多地研究一下SQLAlchemy,看看我是否能找到适合的地方。

回答

2

LOAD DATA INFILE有一个IGNORE LINES选项,您可以使用它来跳过标题。根据the docs,它还有一个“LINES STARTING BY'prefix_string'”选项,您可以使用该选项,因为所有数据行似乎都以两个空格开始,而您的时间戳从行首开始。

+0

这可能适用于第一次加载文件,但是如何只读取最后几行更新数据库? – mouche 2009-07-28 18:40:29

+0

使用IGNORE LINES? – oggy 2009-07-28 22:34:45

2

另一种方法是让Python为您转换文件。您可以根据您指定的标准轻松地将输入文件过滤为输出文件。此代码假定您有一些函数is_data(line),它检查您指定的条件的行,如果它是数据,则返回true。

with file("output", "w") as out: 
    for line in file("input"): 
    if is_data(line): 
     out.write(line) 

此外,如果你的文件只是继续Concat的,你可以把它存储和读取最后记录的偏移量(此代码可能不是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())