Power BI中R脚本正则仅返回首个MAC地址 如何提取全部结果?
问题原因
你当前脚本的核心问题有两个:
gregexpr本身会返回每个输入字符串的所有匹配结果列表,但你原来的getMacs函数用unlist把所有行的匹配结果拍平成了一个一维向量,R在给数据框列赋值时会自动循环补全,导致每行只拿到第一个匹配值- 要让Power Query识别单单元格多值,你可以选择两种存储方式:R列表列 或者 自定义分隔符拼接的字符串,后者对Power Query后续处理更友好,兼容性更高。
方案1:自定义分隔符拼接MAC地址(推荐,兼容性最好)
直接修改你的R脚本如下:
# 'dataset' holds the input data for this script # Variables pattern <- "([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})|([0-9a-fA-F]{4}\\.[0-9a-fA-F]{4}\\.[0-9a-fA-F]{4})" # Functions getMacs <- function(x) { # 逐行匹配所有MAC match_res <- regmatches(x, gregexpr(pattern, x)) # 每行的多个MAC用|拼接,无匹配则返回空值 sapply(match_res, function(m) { if(length(m) == 0) return("") paste(m, collapse = "|") }) } # 生成新列 dataset$MACs1 <- getMacs(dataset$NICs) output <- dataset
后续Power Query处理:选中MACs1列,点击「拆分列」-「按分隔符」,选择|作为分隔符,拆分选项选「拆分为行」即可。
方案2:直接存储为列表列
如果你希望直接在R侧生成列表列,脚本修改如下:
# 'dataset' holds the input data for this script # Variables pattern <- "([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})|([0-9a-fA-F]{4}\\.[0-9a-fA-F]{4}\\.[0-9a-fA-F]{4})" # Functions getMacs <- function(x) { match_res <- regmatches(x, gregexpr(pattern, x)) # 空匹配替换为NA避免长度错误 lapply(match_res, function(m) if(length(m) == 0) NA_character_ else m) } # 生成列表列 dataset$MACs1 <- getMacs(dataset$NICs) output <- dataset
后续Power Query处理:导入R脚本返回的结果后,直接选中MACs1列,点击「扩展到新行」即可。
内容的提问来源于stack exchange,提问作者Chiper
相关产品推荐
相关产品推荐

