R加载CSV文件后grepl函数返回结果不符合预期问题排查
问题根源
你遇到的匹配异常是CSV导入的字符串中肉眼可见的空格并非标准ASCII空格(编码U+0020),大概率是不间断空格(U+00A0)、全角空格(U+3000)、制表符等特殊空白字符,这类字符和普通空格编码不同,因此匹配普通空格的规则全部失效。
排查验证方法
运行以下命令对比两个字符串的字符编码即可确认:
# 查看数据框取出的字符串每个字符的编码值 utf8ToInt(Parks[1,2]) # 查看手动输入的字符串每个字符的编码值 utf8ToInt("Abraham Lincoln Birthplace National Historical Park")
对比结果中对应空格位置的数值:普通空格编码为32,特殊空白字符编码一般为160(不间断空格)、12288(全角空格)。
解决方案
方案1:预处理统一替换所有空白字符
对数据框的对应列做预处理,将所有类型的空白字符替换为标准空格,后续匹配逻辑完全不需要修改:
# perl模式下\\s匹配所有类型的空白字符 Parks[[2]] <- gsub("\\s", " ", Parks[[2]], perl = TRUE)
如果要避免多余空格,也可以用\\s+匹配连续空白,统一替换为单个空格:
Parks[[2]] <- gsub("\\s+", " ", Parks[[2]], perl = TRUE)
方案2:匹配时兼容所有空白字符
如果不需要修改原数据,写匹配规则时用\\s代替普通空格即可:
# \\s+匹配1个及以上任意类型的空白字符 grepl("National\\s+Historical\\s+Park", Parks[1,2])
额外排查点
如果导入CSV时未指定编码,也可能出现字符解析异常,导入时可以根据文件实际编码指定参数:
# UTF-8编码文件 read.csv("你的文件路径.csv", encoding = "UTF-8") # 中文Windows默认编码文件 read.csv("你的文件路径.csv", encoding = "GBK")
内容的提问来源于stack exchange,提问作者Michael Cantrall
相关产品推荐
相关产品推荐

