【发布时间】:2017-05-14 11:49:07
【问题描述】:
我正在尝试使用 OpenRefine 2.6 中的 value.match 命令将列中的信息拆分为(至少)2 列。
但是,数据非常混乱。
我有时有完整的约会:
May 30, 1949
有时完整的日期会与其他日期和属性相结合:
May 30, 1949, published 1979May 30, 1949 and 1951, published 1979May 30, 1949, printed 1980May 30, 1949, print executed 1988May 30, 1949, prints executed 1988published 1940
有时你有时间跨度:
1905-05 或 1905-1906
有时只有一年
1905
有时带有属性的年份
August or September 1908
似乎没有遵循任何特定的架构或顺序。
我想提取(至少)ca 开始和结束日期年份,以便有两列:
-----------------------
|start_date | end_date|
|1905 | 1906 |
-----------------------
没有其余的属性。
我可以使用value.match(/.*(\d{4}).*?/)[0]
找到最后日期
第一个是value.match(/.*^(\d{4}).*?/)[0]
但我在这两个公式上遇到了一些麻烦。
后者在以下情况下无法匹配任何内容:May 30, 1949 and 1951, published 1979
而在以下情况下:Paris, winter 1911-12
后一个公式不能匹配任何东西,前一个公式匹配 1911
有人知道我该如何解决这个问题吗?
我需要一个解决方案,将第一个日期作为 start_date,将最终日期作为 end_date,或者更好(不知道是否可能)将最早日期作为 start_date,将最晚日期作为 end_date。
此外,我很乐意了解如何提取其他信息,例如
如果 published 或 printed 或 executed 出现在文本中 -> 将日期复制到新的列名称“执行”。
应该类似于创建一个新列
if(value.match("string1|string2|string3" + (\d{4}), "perform the operation", do nothing)
【问题讨论】:
-
在你的例子中(你说有时完整的日期与其他日期和属性相结合),你能告诉每一行什么应该是 start_date 和 end_date ?不清楚。
-
完全正确。我会选择第一个日期作为 start_date,最后一个日期作为 end_date,或者更好(不知道是否可能)最早日期作为 start_date,最晚日期作为 end_date。
标签: regex date openrefine