2016-10-19 65 views
0

有沒有辦法告訴uniques()忽略大小寫?OpenRefine文本變換unique()忽略case

我有一個運行狀

forEach(value.split(","),v,v.trim()).uniques().join(",") 

這需要由逗號分隔的小區中的每個值,然後在該細胞吐出的獨特價值/ s的GREL。很好的作品,但如果我有一個包含 Paul的單元格,PAUL會返回而不僅僅是'Paul'。

是否有可能將所有的值暫時轉換爲大寫比較,然後返回第一次拼寫的唯一?

或者我應該用Python/Jython來做到這一點?

+0

你能不能給起始組數據的一個例子,你想從它的輸出是什麼? –

回答

1

檢查我明白的問題 - 例如,如果你開始:

保羅,保羅,愛德華,愛德華

我說得對假設你想結束了:

保羅,愛德華

假設我已經理解了這一點,那麼我認爲我的方法是創建忽略大小寫的唯一值,然後回顧原始值並提取與特定鍵匹配的第一個值。

因此,像: 的數據複製到一個名爲「鍵」使用「編輯列 - >添加基於此列列」與GREL改造新列:

forEach(value.split(","),v,v.trim().toLowercase()).uniques().join(",") 

現在您有:

| Col1     | keys  | 
|-------------------------|-------------| 
| Paul,PAUL,Edward,edward | paul,edward | 

您現在可以迭代鍵列中的值,並找到Col1中的第一個值,該值將使用相同的轉換轉換爲該鍵:。要做到這一點的「密鑰」列,您可以使用轉換:

forEach(value.split(","),v,filter(cells["Col1"].value.split(","),w,w.trim().toLowercase()==v)[0]).join(",") 

這應該離開你

| Col1     | keys  | 
|-------------------------|-------------| 
| Paul,PAUL,Edward,edward | Paul,Edward | 

當然,值得注意的是,如果你的原始數據是按不同的順序你會得到不同的最終價值 - 例如「保羅,保羅,愛德華,愛德華」最終會與「保羅,愛德華」結束。有可能做更多的工作來改善這一點,但是會有限制。

+0

感謝您的幫助,這是非常寶貴的。 –

1

根據您的數據,您可能還需要通過進入記錄模式並執行「拆分多值單元」而不是長GREL連接()表達式來轉換問題,從而創建每個值的額外記錄行。

|Col1      |Split  | 
|Paul, PAUL, Edward, edward |Paul  | 
|       |PAUL  | 
|       |Edward  | 
|       |edward  | 

從那裏,你可以拆分列操作或創建基於唯一身份新列,其他Grel表情等你可以做一個向下填充在col1因此,進一步的操作不會失去他們的密鑰記錄'保羅,保羅,愛德華,愛德華'。

請記住,OpenRefine有很棒的GREL操作,但很多功能來自記錄模式,Facets和Row操作......不僅僅是Column和Cell操作。所以不要把自己限制在很長的完整的Grel語法中。嘗試使用所有OpenRefine的操作和模式來分解問題。

有關「拆分多值單元」等操作的詳細信息,請參見我們的wiki節:https://github.com/OpenRefine/OpenRefine/wiki/Cell-Editing#splitting-multiple-values-within-cells-to-produce-records

+0

感謝記錄模式幫助我解決了其他問題。 –