0

我有很多统一行的文本文件,我想将它们加载到 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

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

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

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

我有数千行数据,所以一开始加载我已经拥有的所有文件可能会很慢,但之后,我只想加载文件的行。所以,我需要对我加载的内容有所选择,因为我不想要重复的信息。

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

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

4

2 回答 2

2

另一种方法是让 Python 为您转换文件。您可以让它根据您很容易指定的条件将输入文件过滤为输出文件。此代码假定您有一些函数 is_data(line) 检查 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())
于 2009-07-28T18:42:22.703 回答
2

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

于 2009-07-28T18:15:11.760 回答