OpenRefine 文本转换 unique() 忽略大小写
OpenRefine text transform unique() ignoring case
有没有办法告诉 uniques() 忽略大小写?
我有一个运行起来像
的GREL
forEach(value.split(","),v,v.trim()).uniques().join(",")
这会获取单元格中以逗号分隔的每个值,然后在该单元格中吐出唯一的 value/s。效果很好,但是如果我有一个包含
Paul, PAUL 它会 return 两者而不仅仅是 'Paul'.
是否可以将所有值暂时转换为大写以进行比较,然后 return 您的第一个拼写是独一无二的?
检查我是否理解问题 - 例如,如果您从以下内容开始:
保罗,保罗,爱德华,爱德华
我假设你想要结束是对的吗:
保罗,爱德华
假设我已经理解了这一点,那么我认为我的方法是创建忽略大小写的唯一值,然后回顾原始值并提取第一个与特定键匹配的值。
所以是这样的:
使用 "Edit column->Add column based on this column" 和 GREL 转换将数据复制到名为 'keys' 的新列中:
forEach(value.split(","),v,v.trim().toLowercase()).uniques().join(",")
现在你有:
| Col1 | keys |
|-------------------------|-------------|
| Paul,PAUL,Edward,edward | paul,edward |
您现在可以遍历键列中的值,并在 Col1 中找到将使用相同转换转换为该键的第一个值:。要在 'key' 列上执行此操作,您可以使用转换:
forEach(value.split(","),v,filter(cells["Col1"].value.split(","),w,w.trim().toLowercase()==v)[0]).join(",")
那应该留给你
| Col1 | keys |
|-------------------------|-------------|
| Paul,PAUL,Edward,edward | Paul,Edward |
当然值得注意的是,如果您的原始数据的顺序不同,您将获得不同的最终值 - 例如"PAUL,Paul,Edward,edward" 将以 "PAUL,Edward" 结束。可以做更多的工作来改进这一点,但会有限制。
根据您的数据,您可能还需要通过进入记录模式并执行 "Split multi-valued cells" 而不是您的长 GREL join() 表达式来解决问题...从而创建额外的记录每个值的行数。
|Col1 |Split |
|Paul, PAUL, Edward, edward |Paul |
| |PAUL |
| |Edward |
| |edward |
从那里您可以对拆分列进行操作或基于唯一性、其他 Grel 表达式等创建新列。您可以对 Col1 进行向下填充,以便进一步的操作不会丢失其关键记录 'Paul, Paul, Edward, edward'.
请记住,OpenRefine 有很棒的 GREL 操作,但很多功能来自记录模式、Facets 和 Row 操作……不仅是 Column 和 Cell 操作。因此,不要将自己局限于长而完整的 Grel 语法。尝试使用 OpenRefine 的所有操作和模式来分解问题。
有关 'Split multi-valued cells' 和其他操作的更多信息,请参阅我们的 wiki 部分:https://github.com/OpenRefine/OpenRefine/wiki/Cell-Editing#splitting-multiple-values-within-cells-to-produce-records
有没有办法告诉 uniques() 忽略大小写?
我有一个运行起来像
的GRELforEach(value.split(","),v,v.trim()).uniques().join(",")
这会获取单元格中以逗号分隔的每个值,然后在该单元格中吐出唯一的 value/s。效果很好,但是如果我有一个包含 Paul, PAUL 它会 return 两者而不仅仅是 'Paul'.
是否可以将所有值暂时转换为大写以进行比较,然后 return 您的第一个拼写是独一无二的?
检查我是否理解问题 - 例如,如果您从以下内容开始:
保罗,保罗,爱德华,爱德华
我假设你想要结束是对的吗:
保罗,爱德华
假设我已经理解了这一点,那么我认为我的方法是创建忽略大小写的唯一值,然后回顾原始值并提取第一个与特定键匹配的值。
所以是这样的: 使用 "Edit column->Add column based on this column" 和 GREL 转换将数据复制到名为 'keys' 的新列中:
forEach(value.split(","),v,v.trim().toLowercase()).uniques().join(",")
现在你有:
| Col1 | keys |
|-------------------------|-------------|
| Paul,PAUL,Edward,edward | paul,edward |
您现在可以遍历键列中的值,并在 Col1 中找到将使用相同转换转换为该键的第一个值:。要在 'key' 列上执行此操作,您可以使用转换:
forEach(value.split(","),v,filter(cells["Col1"].value.split(","),w,w.trim().toLowercase()==v)[0]).join(",")
那应该留给你
| Col1 | keys |
|-------------------------|-------------|
| Paul,PAUL,Edward,edward | Paul,Edward |
当然值得注意的是,如果您的原始数据的顺序不同,您将获得不同的最终值 - 例如"PAUL,Paul,Edward,edward" 将以 "PAUL,Edward" 结束。可以做更多的工作来改进这一点,但会有限制。
根据您的数据,您可能还需要通过进入记录模式并执行 "Split multi-valued cells" 而不是您的长 GREL join() 表达式来解决问题...从而创建额外的记录每个值的行数。
|Col1 |Split |
|Paul, PAUL, Edward, edward |Paul |
| |PAUL |
| |Edward |
| |edward |
从那里您可以对拆分列进行操作或基于唯一性、其他 Grel 表达式等创建新列。您可以对 Col1 进行向下填充,以便进一步的操作不会丢失其关键记录 'Paul, Paul, Edward, edward'.
请记住,OpenRefine 有很棒的 GREL 操作,但很多功能来自记录模式、Facets 和 Row 操作……不仅是 Column 和 Cell 操作。因此,不要将自己局限于长而完整的 Grel 语法。尝试使用 OpenRefine 的所有操作和模式来分解问题。
有关 'Split multi-valued cells' 和其他操作的更多信息,请参阅我们的 wiki 部分:https://github.com/OpenRefine/OpenRefine/wiki/Cell-Editing#splitting-multiple-values-within-cells-to-produce-records