我试图将表格数据从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的朋友 - 这对我开始学习是一个很好的项目吗?谢谢!
答案 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
文件。