我有一个奇怪格式的数据文件,我正在尝试将其导入并转换到 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”,但它并没有用分号替换非分隔逗号
如果还有其他可行的方法,我洗耳恭听!
您可以用引号替换 '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"