替换字符的所有实例,但仅限于匹配的字符串中

问题描述 投票:0回答:1

我有一个奇怪格式的数据文件,我正在尝试将其导入并转换到 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
(删除“NONASCII”后),我会得到类似这样的东西,这不是我想要的:

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

我不确定

gsub
是否是用于此目的的最佳函数,但我已经弄清楚如何至少将有问题的字符串与正则表达式匹配:

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

这就是我所了解到的。上面的代码只是去掉了“NONASCII”,但它并没有用分号替换非分隔逗号

如果还有其他可行的方法,我洗耳恭听!

r regex text delimiter strsplit
1个回答
0
投票

您可以用引号替换 'NONASCII',扫描数据,然后用分号替换逗号:

my_string |>
  gsub("NONASCII", "'", x = _) |>
  scan(text = _, sep = ",", what = character()) |>
  gsub(",", ";", x = _)

 [1] "1"                     "2"                     "3"                     "4"                     "some text; here"      
 [6] "7"                     "8"                     "9"                     ";more; pesky; commas;" "10"                   
[11] "11" 
© www.soinside.com 2019 - 2024. All rights reserved.