我每天都会获得数据,这些数据只是结构松散。我需要将其导入数据库,以便我可以运行一个报告来查找新记录并更改现有记录。
数据如下所示:
--------------------------------
blah:
foo
bar
lorum: ipsum
dolor: sit
foo: bar
bar: foo
123-555-1212
Lorum / Ipsum / Dolor / Sit
Foo / Bar
--------------------------------
正如您所看到的,有一些字段标题,如" blah"," lorum"等等,但有些数据缺少标题,如电话号码或斜线分隔列表。有些标题在同一行,有些标题则没有。
为了让我们保持警惕,记录中没有相同数量的字段。
所以我认为解析需要至少有3种方法来解析数据,
如果"标题:$"然后抓住下一行,直到下一行" *。:"被读了 和 抓住"标题:价值" 和 如果行以数字开头,则假设标题为" phone" 和 如果line包含斜杠分隔列表,则假定标题为" features"直到" --------..."
但我不知道如何开始这样的编码。虽然我必须在MacOS中运行代码,但此时语言是开放的。
我认为perl可能对此有好处,但是perl foo非常差。
甚至不知道从哪里开始。
答案 0 :(得分:0)
你总是需要假设你的文字,否则你会练习NLP。
我们可以假设非键值部分到底是什么时候?是这样,以下正则表达式将帮助您:
# split the text into records:
@records = split /\n-----------------\n/, $text;
# this will find lines that have another key/value pair after it
qr/\A(\w+):(.*?)(?=\n\w+:)/ms
# then the last key/value, that probably must be one line:
qr/^(\w+):(.*)/
我建议每次成功匹配后,删除匹配的文本并继续。
其他有用的假设:电话号码只能在记录中出现一次(而不是其他键/值的一部分)。