如何将多行文本导入数据库?

时间:2018-04-17 11:48:47

标签: python sql-server regex import notepad++

我试图将表格数据从PDF导入数据库(MS Access或SQL Server Express)。数据看起来像这样:

NAME                        ID    EDUCATION      YEAR
--------------------------- ---- -------------- --------
Doe, John                   123   Elementary     2000
  New York, NY                    H School       2004
                                  Undergrad      2008
--------------------------------------------------------
Furter, Frank               345   Elementary     2010
  Los Angeles, CA                 H School       2014
--------------------------------------------------------
Chiever, Hiya               456   Elementary     2000
  Washington, DC                  H School       2003
                                  Undergrad      2006
                                  Masters        2008
                                  PhD            2010
--------------------------------------------------------
Walker, Julie               234   Elementary     2000
  Chicago, IL                     H School       2004
                                  Undergrad      2008
                                  Masters        2010
--------------------------------------------------------

复制内容并粘贴到Excel中,每个项目大约有一行,所以它看起来像这样:

Doe, John
New York, NY
123
Elementary 2000
H School 2004
Undergrad 2008

我想有任何建议将其纳入规范化的RDBMS。我的想法是:

1 - 看看SQL Server Management Studio是否仍然支持数据导入的javascript编码(我记得20年前这样做过)但我不记得每条记录是否需要一定数量的行。

2 - 使用一堆Find& amp;在Notepad ++中破解数据。替换命令,使其变为每人一行。

3 - 使用Notepad ++注入XML标记,并将XML导入到RDBMS中。

转换/导入的其他建议?我认识OmniPage Ultimate的人可能会有用,但我不太了解它确实会做出任何决定。我也有一位熟悉Python的朋友 - 这对我开始学习是一个很好的项目吗?谢谢!

1 个答案:

答案 0 :(得分:0)

由于您使用Python标记了问题,因此使用相当多的编程逻辑的方法。这可能超越顶部,您应该寻找通过其他工具获取信息的方法。

话虽这么说,你可以自己构建一个获取每列长度的类,将字符串拆分成几条记录(两边用---分隔),将每条记录转换为不同列的矩阵(在这种情况下四个)并最终为每个记录产生一个字典。

<小时/> 在Python

class cleanItems:
    def __init__(self, string):
        self.string = string
        self.cols = self.getColumnWidths()

    def getColumnWidths(self):
        ''' Get the length of every column '''
        rx = re.compile(r'^(NAME\s+)(ID\s+)(EDUCATION\s+)(YEAR\s+)', re.M)
        match = rx.search(data)
        if match:
            return [len(group) for group in match.groups()]

    def getEntries(self):
        rx = re.compile(r'^[ -]+$', re.M)
        for record in rx.split(self.string):
            # discard empty lines and the header
            lines = [line for line in record.split('\n') if line.strip()]
            if len(lines) > 1:
                matrix = [[line[sum(self.cols[0:i]):sum(self.cols[0:i+1])] 
                            for i in range(len(self.cols))] 
                            for line in lines]

                result = {'name': matrix[0][0].strip(), 'id': matrix[0][1].strip(), 
                            'town': matrix[1][0].strip(), 'school': [matrix[i][2].strip() for i in range(len(matrix))],
                            'years': [matrix[i][3].strip() for i in range(len(matrix))]}
                yield result

ci = cleanItems(data)
for record in ci.getEntries():
    print(record)

这会产生

{'name': 'Doe, John', 'id': '123', 'town': 'New York, NY', 'school': ['Elementary', 'H School', 'Undergrad'], 'years': ['2000', '2004', '2008']}
{'name': 'Furter, Frank', 'id': '345', 'town': 'Los Angeles, CA', 'school': ['Elementary', 'H School'], 'years': ['2010', '2014']}
{'name': 'Chiever, Hiya', 'id': '456', 'town': 'Washington, DC', 'school': ['Elementary', 'H School', 'Undergrad', 'Masters', 'PhD'], 'years': ['2000', '2003', '2006', '2008', '2010']}
{'name': 'Walker, Julie', 'id': '234', 'town': 'Chicago, IL', 'school': ['Elementary', 'H School', 'Undergrad', 'Masters'], 'years': ['2000', '2004', '2008', '2010']}

您可以轻松将其输入数据库或XML文件。