在R语言中实现按列匹配条形码查询对应工具的问题
嘿,我来帮你搞定这个问题!首先你的原始数据是一段未结构化的文本,得先把它整理成R里能用的结构化数据框,之后再写查询函数就轻松多啦。
第一步:把原始文本转换成结构化数据集
首先我们要把你提供的杂乱文本拆分成每条独立记录,再提取出条形码和对应的工具名称:
# 先把原始文本赋值给变量 raw_text <- "004041 FLASHLIGHT SUREFIRE GX2 - TACTICAL UNK B-3 SAT 004044 FLASHLIGHT SUREFIRE G2X TACTICAL NONE D-3 1/11/17 SAT 004045 FLASHLIGHT SUREFIRE GX2 - TACTICAL UNK D-3 SAT 004045 TACTICAL LIGHT SUNFIRE 4045 D-3 1/17/18 SAT 2_3VOLT BATTERIES 004048 FLASHLIGHT SUREFIRE G2X TACTICAL NONE D-3 1/11/17 SAT" # 以"SAT"为分隔符拆分每条记录 records <- strsplit(raw_text, " SAT ")[[1]] # 去掉最后一个空元素(因为原始文本结尾是SAT) records <- records[records != ""] # 定义函数来解析单条记录的条形码和工具名 parse_record <- function(record) { parts <- strsplit(record, " ")[[1]] # 条形码是每条记录的第一个元素 barcode <- parts[1] # 提取工具名称:从第二个元素开始,直到遇到非纯字母/空格/连字符的字段(比如UNK、D-3、日期) tool_end <- which(!grepl("^[A-Z -]+$", parts))[1] - 1 if (is.na(tool_end)) tool_end <- length(parts) tool_name <- paste(parts[2:tool_end], collapse = " ") return(data.frame(barcode = barcode, tool_name = tool_name, stringsAsFactors = FALSE)) } # 批量处理所有记录,生成结构化数据框 tool_df <- do.call(rbind, lapply(records, parse_record))
运行完这段代码后,你会得到一个tool_df数据框,包含barcode(条形码)和tool_name(工具名称)两列,数据就规整好啦。
第二步:创建条形码查询函数
现在有了结构化数据,写一个根据条形码查询工具的函数就非常简单:
get_tool_by_barcode <- function(target_barcode) { # 匹配目标条形码,提取对应的工具名称 matched_tools <- tool_df$tool_name[tool_df$barcode == target_barcode] # 处理不同情况的返回结果 if (length(matched_tools) == 0) { return(paste("未找到条形码", target_barcode, "对应的工具")) } else if (length(matched_tools) > 1) { return(paste("条形码", target_barcode, "对应多个工具:", paste(matched_tools, collapse = "; "))) } else { return(matched_tools) } }
测试函数效果
你可以直接调用这个函数测试:
# 查询单个条形码 get_tool_by_barcode("004041") # 输出:"FLASHLIGHT SUREFIRE GX2 - TACTICAL" # 查询对应多个工具的条形码 get_tool_by_barcode("004045") # 输出:"条形码 004045 对应多个工具:FLASHLIGHT SUREFIRE GX2 - TACTICAL; TACTICAL LIGHT SUNFIRE 4045" # 查询不存在的条形码 get_tool_by_barcode("000000") # 输出:"未找到条形码 000000 对应的工具"
可调整的细节
如果你的原始数据记录分隔符不是"SAT",或者条形码规则有变化,你可以修改parse_record函数里的逻辑来适配。比如如果有些记录没有"SAT"结尾,可以找其他统一的分隔特征来拆分记录。
内容的提问来源于stack exchange,提问作者Greg Pedersen
相关产品推荐
相关产品推荐

