Regex 在现有列上使用逻辑测试在OpenRefine中创建列?

Regex 在现有列上使用逻辑测试在OpenRefine中创建列?,regex,openrefine,google-refine,grel,Regex,Openrefine,Google Refine,Grel,我有一个原始数据集,其中有4500多行条目表示土地交易。其中一个现有列是Place,在每个单元格值中,我通常将locality名称作为某个邻居,但有时当有一个我不知道的地方时,我会从公证记录中添加其他信息,例如,某个邻居、某个县,甚至是某个邻居、某个县的昵称 我想使用这一列中的信息创建两个新列。第一列包含上级行政区划,第二列包含上级行政区划——有点像缩小 我想我需要在现有列的基础上创建一个新列,使用一种逻辑测试或if-test,其中我可以枚举属于县1、县2或市1的某个邻里的值,等等。然后,基于这

我有一个原始数据集,其中有4500多行条目表示土地交易。其中一个现有列是Place,在每个单元格值中,我通常将locality名称作为某个邻居,但有时当有一个我不知道的地方时,我会从公证记录中添加其他信息,例如,某个邻居、某个县,甚至是某个邻居、某个县的昵称

我想使用这一列中的信息创建两个新列。第一列包含上级行政区划,第二列包含上级行政区划——有点像缩小

我想我需要在现有列的基础上创建一个新列,使用一种逻辑测试或if-test,其中我可以枚举属于县1、县2或市1的某个邻里的值,等等。然后,基于这个新列,我将创建另一个包含州1、州2等的列。,大概是使用相同的测试

我将如何在OpenRefineGrel中使用正则表达式来编写此代码?如何将单元格中的多个可能值串在一起?我尝试使用单元格和value.contains,但我不知道如何像这样将倍数串在一起

再次回顾一下,我想编写一个脚本来创建一个新列,该列包含基于现有值列的新单元格值,如

如果是街道1、街道2、街道5,但不是街道3或街道4,则为第1个国家

如果是1号街、2号街或5号街,则为1号街,如果是3号街或4号街,则为2号街

编辑: 以下是一些数据:

land sale   0.350   carreau 350 gourdes Bullet
land sale   1.000   carreau 700 gourdes Campèche
land sale   0.200   carreau 220 gourdes Bremont
land sale   0.500   carreau 150 gourdes Pierrette
land sale   5.000   carreau 225 gourdes Lagenivrée
land sale   0.125   carreau 200 gourdes Bullet
land sale   1.000   carreau 300 gourdes Tozin
land sale   0.125   carreau 100 gourdes Dufort
land sale   0.250   carreau 135 gourdes Charitte, Savann Brute
land sale   0.500   carreau 300 gourdes Ravines des Roches
land sale   0.500   carreau 80  gourdes Isidore (Nègre Libre)
land sale   0.500   carreau 215 gourdes Nordette (Boures)
land sale   0.250   carreau 200 gourdes Bullet (Morne Montègue)
下面是两个新列的预期结果示例,比如Commune和Section:

land sale   0.350   carreau 350 gourdes Limonade    Bwadlans    Bullet
land sale   1.000   carreau 700 gourdes Limonade    Bwadlans    Campèche
land sale   0.200   carreau 220 gourdes Limonade    Bwadlans    Bremont
land sale   0.500   carreau 150 gourdes Limonade    Roucou      Pierrette
land sale   5.000   carreau 225 gourdes Limonade    Roucou      Lagenivrée
land sale   0.125   carreau 200 gourdes Limonade    Bwadlans    Bullet
land sale   1.000   carreau 300 gourdes Quart_Mor   Sablé       Tozin
land sale   0.125   carreau 100 gourdes Limonade    Bwadlans    Dufort
land sale   0.250   carreau 135 gourdes Limonade    Bwadlans    Charitte, Savann Brute
land sale   0.500   carreau 300 gourdes Limonade    Bwadlans    Ravines des Roches
land sale   0.500   carreau 80  gourdes Limonade    Bwadlans    Isidore (Nègre Libre)
land sale   0.500   carreau 215 gourdes Limonade    Bwadlans    Nordette (Boures)
land sale   0.250   carreau 200 gourdes Limonade    Bwadlans    Bullet (Morne Montègue)

有许多方法,您选择的方法可能取决于“初始位置”列中有多少值

我推荐第一种方法作为起点

方法1-使用方面:

a添加空白列,例如Commune,部分使用“添加 列,并使用 “null”作为GREL公式 b在“放置”列上,选择一组 同一公社和部门的价值观,例如。 “Bullet”、“Campéche”、“Bremont”等,然后编写公式进行更新 带有“Bwadlans”和“Limonade”的社区和分区栏 c重复 对于每个社区/区域,有一组场所 方法2-使用查找: 如果您已经有一个Places->Commune&Section的映射,您可以将其创建为一个单独的OpenRefine项目,然后使用“cross”查找每个地点的Commune/Section

创建一个OpenRefine项目,每个位置有一行列用于Place、Commune和Section b在初始项目中,基于类似GREL的Place列创建一个新列:cell.cross'Place mapping project','Place'[0]。cells[Commune].value c重复b,但对于截面值,例如cell.cross'place mapping project',place'[0]。cells[Section]。value 方法3-使用条件: 我认为这是你首先要求的方法,但我不认为这一定是最好的选择

从任意位置列使用“基于此列添加列”,使用类似GREL的iforvalue==Bullet,value==Campéche,Bwadlans, b对于其他位置,您可以通过引用Place列中的值在新列上写入类似的GREL,例如iforcells[Place]。value==Pierrette,cells[Place]。value==lagenivreée,Roucou 请注意,要使用两个以上的条件,必须嵌套“或”语句,例如: ororrvalue==Bullet,value==Campéche,value==Bremont


方法2和方法3可以通过安装OpenRefine扩展来简化,OpenRefine扩展有助于此过程,建议方法2使用VIB-BITS扩展,方法3使用带有“inArray”功能的gokbutils扩展,这将避免复杂的“或”语句,正如您在Owen的回答方法3中看到的那样,条件句对格雷尔来说很棘手。如果这确实是您想要做的,那么使用Python/Jython。以下是一个基于您的数据的示例:

value = value.strip().lower()

if "pierrette" in value or "lagenivrée" in value:
    return "Limonade||Roucou"
elif "tozin" in value:
    return "Quart_Mor||Sablé"
else:
    return "Limonade||Bwadlans"
然后使用| |作为分隔符拆分新列,请参见屏幕广播

当然,您可以使用括号而不是中的括号创建更复杂的条件

假例子:

    value = value.strip().lower()

    if "pierrette" in value or "lagenivrée" in value:
        return "Limonade||Roucou"
    elif "tozin" in value:
        return "Quart_Mor||Sablé"
    elif ( ("ravinne" in value or "lagenivrée" in value) 
           and ("des roches" not in value or "savan" not in value)):
        return "Somewhat||Somewath else"
    else:
        return "Limonade||Bwadlans"

你能发一份你的数据样本吗?OpenRefine通常需要屏幕广播,使用数据要比复制数据容易得多。您在帖子中提到了社区、县、街道,但在示例数据中没有类似的内容。我的问题是,我甚至看不出你到底想做什么。你能不能也给出一个预期结果的例子,而不仅仅是最初的数据?我试图以一种面向更普通的观众的方式来阐述这个问题,比如,他们可能会处理街道或其他更熟悉的问题。这些是Bullet、Bremont等,是Haitit的社区@我将再次编辑这个问题 显示预期的结果。