将非统一数据从txt文件加载到mysql数据库中

时间:2009-07-28 18:09:00

标签: python mysql file-io sqlalchemy load-data-infile

我有很多统一行的文本文件,我想加载到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,然后看看我是否能够得到它。

2 个答案:

答案 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())