代码之家  ›  专栏  ›  技术社区  ›  mouche

将非均匀数据从TXT文件加载到MSQL数据库中

  •  0
  • mouche  · 技术社区  · 16 年前

    我有很多统一行的文本文件,我想将它们加载到MySQL数据库中,但这些文件并不是完全统一的。开始时有几行用于获取其他信息,每6行有一个时间戳。

    因为我的文件格式,“加载数据内嵌”看起来不像这里的答案。它似乎不够灵活。

    注意:文件头占用预先确定的行数。时间戳是可预测的,但也有一些其他随机注释可以弹出,需要忽略。他们总是以几个关键词开始,我可以检查。

    中间的文件示例:

      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
    

    从这里,我需要将信息加载到三个字段中。第一个字段需要是文件名,另一个字段在示例中存在。我可以将文件名添加到每个数据行前面,但如果使用脚本加载数据,则可能不需要这样做。

    如果需要,我可以更改文件格式,但我不想丢失时间戳和头信息。

    对于我相当熟悉的python来说,sqlacalchemy似乎是一个不错的选择。

    我有成千上万行的数据,因此在一开始加载我已经拥有的所有文件可能会很慢,但之后,我只想加载到 新的 文件行。所以,我需要有选择性地输入内容,因为我不需要重复的信息。

    对于从文本文件到MySQL数据库的选择性数据加载方法有什么建议吗? 除此之外,对于只加载数据库中不存在的文件行,您有什么建议?

    谢谢大家。同时,我会进一步研究一下sqlacalchemy,看看我是否能从中得到什么。

    2 回复  |  直到 16 年前
        1
  •  2
  •   oggy    16 年前

    “加载数据”内嵌有一个“忽略行”选项,可用于跳过标题。根据 the docs 它还有一个“以前缀字符串开头的行”选项,您可以使用它,因为您的所有数据行似乎都以两个空格开头,而时间戳则从行的开头开始。

        2
  •  2
  •   Christopher    16 年前

    另一种方法是让python为您转换文件。您可以让它根据您非常容易指定的条件将输入文件筛选为输出文件。此代码假定您有一些函数是_data(line),它检查line中指定的条件,如果是data,则返回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())