【问题标题】:How to import multiline text into a database?如何将多行文本导入数据库?
【发布时间】:2018-04-17 11:48:47
【问题描述】:

我正在尝试将表格数据从 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 - 在 Notepad++ 中使用一堆查找和替换命令破解数据,使其变成每人一行。

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

还有其他关于转换/导入的建议吗?我认识一个使用 OmniPage Ultimate 的人,这可能很有用,但我对它的了解还不够,所以决定了哪种方式。我还有一个朋友很了解 Python——这对我来说是一个很好的项目吗?谢谢!

【问题讨论】:

  • 您可以将其复制到 Notepad++ 或 SublimeText3(我最喜欢的),发现其中的模式(例如每列由制表符分隔),然后进行正则表达式替换。这是我系统地做的。我通过将数据复制到文本编辑器中来将表导入数据库。然后我找到模式并用几个完全构建的 INSERT 语句替换文本。然后只需将结果复制并粘贴到 SQL 控制台中。
  • 这里主要是找到复制文本中的模式。在 SublimeText3 中,我通常选择文本,选项卡表示为线条,空格表示为点。不过,我不知道它在 Notepad++ 中是如何工作的。
  • 试图从原始文本中恢复原始格式是错误的方法。首先使用适当的提取工具,例如pdftotext,可以保留布局,然后尝试在结果的基础上进行构建。

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


【解决方案1】:

由于您使用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 文件中。

【讨论】:

    猜你喜欢
    • 2013-03-11
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多