在单元格中从逗号分隔的列表中删除重复的字符串,

时间:2018-06-19 21:37:42

标签: google-sheets spreadsheet openrefine

我正在使用Google表格,这超出了我的简单脚本编写的范围。

我有许多包含逗号分隔值的单元格;

AA, BB, CC, BBB, CCC, CCCCC, AA, BBB, BB

BB, ZZ, ZZ, AA, BB, CC, BBB, CCC, CCCCC, AA, BBB, BB

我想返回:

AA, BB, CC, BBB, CCC, CCCCC etc.

BB, ZZ, AA, CC, BBB, CCC, CCCCC etc.

...删除重复项。每个单元格。

我无法解决。我已经尝试过所有删除重复项的在线工具。但是它们都会删除整个文档中的重复项。

部分问题是,我不能将单元格按照“字母”顺序放置(这会使事情变得简单),而必须按照它们出现的原始顺序进行保存。

我还可以随意使用(但超出我的能力)Open Refine,我认为这是一个聪明的工具。有人可以将我指向有关此类查询的教程。抱歉,这么简单的问题!

1 个答案:

答案 0 :(得分:4)

这是在OpenRefine中执行此操作的方法。

enter image description here

我使用的公式是:

import           Data.Maybe
import qualified Data.Text       as T
import           Data.URLEncoded as DU
import           Reflex.Dom
import           Control.Monad.Trans as CMT 

url :: T.Text
url = T.pack "parm1=one&parm2=two"

main = do
  mainWidget body

body :: MonadWidget t m => m ()
body  = el (T.pack "div") $ do
  let istr = CMT.liftIO $ DU.importString (T.unpack url)
  t <- fmap (T.pack . fromMaybe "" . DU.lookup "parm2") istr
  text t

这意味着:用逗号分隔单元格中的值,删除重复项,然后再次使用逗号将它们加入。

编辑:

OpenRefine中使用Python而不是GREL的另一种解决方案。这一个可以更好地保留原始顺序。

enter image description here

Python / Jython脚本:

int main ()
{
    int udp_fd = -1;
    struct sockaddr_in sockaddr;

    char *ip = (char *)"xx.yyy.zzz.aaa";
    int port = 1234;
    udp_fd = socket(AF_INET, SOCK_DGRAM, 0);

    if (udp_fd == -1) {
       printf("Could not create socket\n");
       return -1;
    }

    sockaddr.sin_family = AF_INET;
    sockaddr.sin_addr.s_addr = inet_addr(ip);
    sockaddr.sin_port = htons(port);

    if (bind(udp_fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr)) == -1) {
        printf("Could not bind to %s: %d: %d: %d\n", ip, port, errno, udp_fd);
        return -1;
    }

    if (fcntl(udp_fd, F_SETFL, O_NONBLOCK | O_ASYNC) < 0) {
        printf("Error setting socket as non-blocking \n");
        return -1;
    }

    return 0;
}