0

极端的 python/sql 初学者在这里。我环顾四周寻求一些帮助,但无法准确找到我需要的东西 - 非常感谢任何帮助。

正如标题所示,我有一个非常大的文本文件,我想最好使用 python 将其解析为 sql 数据库。文本文件设置如下:

#Parent field 1.1
child 1.1
child 1.1 continued

# Parent field 1.2
child 1.2

# Parent field 1.3
child 1.3 text
child 1.3 text
more child 1.3 text

...

# Parent field 1.88
child 1.88

#Parent field 2.1
child 2.1

etc...

关于列表的一些关键点:

  • 第一个字段(即 1.1、2.1)在 # 之后没有空格
  • 每个子行的长度具有可变的字符长度和换行符,但在下一个父行之前总是有一个空行
  • 每个父级有 88 个字段
  • 有数百个父字段

现在,我希望每个父字段 (1.1, 1.2, 1.3 --> .88) 成为一列,并且行由后续数字填充 (2.1, 3.1 -->100s)

有人可以帮我设置一个 python 脚本并给我一些如何开始解析的方向吗?如果我没有正确解释任务,请告诉我,我会及时提供更多详细信息。

非常感谢!

编辑:我刚刚意识到列数不是恒定的 88,它是可变的

4

2 回答 2

2

几点:

  1. 从描述看来,您的目标是在一张表中对数据进行非规范化。这通常不是一个好主意。将数据拆分为两个表:PARENT 和 CHILDREN。PARENT 应该包含 ID 并且 CHILDREN 应该至少有两列:PARENT_ID 和 CHILD_VALUE(或类似它),其中 PARENT_ID 是父级的 ID,无论是否作为外键 DB 结构显式链接(取决于数据库)。然后,在解析时,将 VALUES("1.1", "1.1childA"), VALUES("1.1", "1.1childB") 等插入表 CHILDREN 相关记录。

  2. 解析应该是微不足道的:逐行迭代并在“父”行上将 parent_id 和 INSERT 更改为 PARENT 并读取子行并将其插入到 CHILDREN 表中。您也可以分两次完成。

像这样:

#!/usr/bin/python

parent=''
child=''

for line in open('input.txt'):
        if line.find('#Parent') > -1 or line.find('# Parent') > -1:
                parent = field_extract(line) # fun where you extract parent value
                parent_id = ... # write it down or generate
                # INSERT into PARENT
        elif line:
                child = field_extract(line)
                # INSERT into CHILDREN with parent_id and child values

Although... I shudder when I see smth so primitive. I'd urge you to learn Pyparsing module, absolutely great for this kind of work.

于 2013-01-18T16:46:43.537 回答
1

你应该看看python中的文件处理

open() , .readlines()方法和列表会帮助你很多

例如:

f = open("NAMEOFTXTFILE.TXT","r") #r for read, w for write, a for append.
cell = f.readlines() # Displays the content in a list
f.seek(0) # Just takes the cursor to the first cell (start of document)
print cell[2] # Prints the word or letter in the second cell.

然后从那里,您可以cell[2]使用 sql 语句发送。

于 2013-01-18T16:43:02.450 回答