代码之家  ›  专栏  ›  技术社区  ›  Taylan Morcol

替换字符的所有实例,但只能在匹配的字符串中替换

  •  1
  • Taylan Morcol  · 技术社区  · 1 年前

    我有一个奇怪的foramt中的数据文件,我正试图将其导入并争论到R中。该文件就像一个CSV,其中的值是逗号分隔的。但是,也有包含逗号的文本字符串不应被解释为分隔符。

    问题是,单个元素没有使用引号。在专有软件中,包含非分隔逗号的文本字符串由特殊的非ASCII字符定界,我猜这就是该软件确定哪些逗号不用作分隔符的方式。

    我已经找到了如何用ASCII字符替换非ASCII字符,使其更容易在R中使用。但是,我仍然没有找到如何正确分割文本。

    我目前的方法是用另一个符号(比如分号)替换所有不分隔的逗号,然后使用 strsplit 逗号。但是,我还没有弄清楚如何用分号代替非分隔逗号。

    出于数据隐私的原因,我将在这里创建一个伪文本字符串:

    my_string <- "1,2,3,4,NONASCIIsome text, hereNONASCII,7,8,9,NONASCII,more, pesky, commas,NONASCII,10,11"
    

    我想要的输出:

     [1] "1"                    "2"                    "3"                    "4"                   
     [5] "some text; here"      "7"                    "8"                    "9"                   
     [9] ";more; pesky; commas;" "10"                   "11" 
    

    如果我跑步 strsplit 照原样(删除“NONSASCII”后),我会得到这样的东西,这不是我想要的:

    [1] "1"         "2"         "3"         "4"         "some text" " here"     "7"         "8"         "9"        
    [10] ""          "more"      " pesky"    " commas"   ""          "10"        "11" 
    
    

    我不确定 gsub 是最好的函数,但我已经找到了如何至少将有问题的字符串与regex匹配:

    my_string2 <- gsub("NONASCII(.*?)NONASCII", "\\1", my_string)
    

    这是我所能做到的。上面的代码只去掉了“NONSASCII”,但没有用分号代替非分隔逗号

    如果还有另一种方法也能奏效,我洗耳恭听!

    1 回复  |  直到 1 年前
        1
  •  2
  •   lroha    1 年前

    您可以将“NONSASCII”替换为引号,扫描中的数据,并将逗号替换为分号:

    my_string |>
      gsub("NONASCII", "'", x = _) |>
      scan(text = _, sep = ",", what = character(), quiet = TRUE) |>
      gsub(",", ";", x = _)
    
     [1] "1"                     "2"                     "3"                    
     [4] "4"                     "some text; here"       "7"                    
     [7] "8"                     "9"                     ";more; pesky; commas;"
    [10] "10"                    "11"