解析r中不带分隔符的文本

mzaanser  于 2023-02-01  发布在  其他
关注(0)|答案(2)|浏览(145)

我需要帮助的想法解析这段文字。
我想用最自然的方式来做。
这是经文

text <-  "JOHN DEERE: PMWF2126 NEW HOLLAND: 441702A1 HIFI: WE 2126 CUMMINS: 4907485"

我需要这个结果:
| 项目a|b.人口基金|
| - ------|- ------|
| 约翰·迪尔|PMWF2126|
| 新荷兰|小行星441|
| 高频|WE 2126|
| 康明斯|小行星4907485|
这是一个例子,有一个不同的标记一个项目id
我试着:

str_split(text, " ")

[[1]]
 [1] "JOHN"     "DEERE:"   "PMWF2126" "NEW"      "HOLLAND:" "441702A1" "HIFI:"    "WE"       "2126"    
[10] "CUMMINS:" "4907485"  "CUMMINS:" "3680433"  "CUMMINS:" "3680315"  "CUMMINS:" "3100310"

谢谢!

sz81bmfz

sz81bmfz1#

该解决方案假设(如示例数据中所示),第二个值始终以数字结尾,而第一列不以数字结尾。如果不是这种情况,则必须修改regex部分(?<=[0-9] )(?=[A-Z]),以便拆分点位于两个圆括号部分之间。

text <- "JOHN DEERE: PMWF2126 NEW HOLLAND: 441702A1 HIFI: WE 2126 CUMMINS: 4907485"

lapply(
  strsplit(
    unlist(strsplit(text, "(?<=[0-9] )(?=[A-Z])", perl = TRUE)), 
    ":"), trimws)

[[1]]
[1] "JOHN DEERE" "PMWF2126"  

[[2]]
[1] "NEW HOLLAND" "441702A1"   

[[3]]
[1] "HIFI"    "WE 2126"

[[4]]
[1] "CUMMINS" "4907485"

关键部分是strsplit(text, "(?<=[0-9] )(?=[A-Z])", perl = TRUE)部分。此操作将查找在数字值后跟空格?<=[0-9]之后出现以大写?=[A-Z]开头的新部分的情况。这些位置将用作拆分点

8xiog9wr

8xiog9wr2#

因为第二个字段总是以数字结尾,而第一个字段不是,所以用数字和换行符替换数字后面的空格,然后使用带有冒号分隔符的read.table

text |>
  gsub("(\\d) ", "\\1\n", x = _) |>
  read.table(text = _, sep = ":", strip.white = TRUE)

给予

V1       V2
1  JOHN DEERE PMWF2126
2 NEW HOLLAND 441702A1
3        HIFI  WE 2126
4     CUMMINS  4907485

如果在你的数据中,第二个字段可以有一个数字,但第一个字段不能,并且数字不一定在字段2的最后一个字的末尾,但可以在字段2的最后一个字的任何地方,那么我们可以使用这个变体,它在这里给出相同的结果。gsubfn与gsub类似,不同之处在于第二个参数可以是函数而不是替换字符串,并且它将捕获组作为输入并替换与函数的输出完全匹配。函数可以用公式符号表示,就像这里所做的那样。

library(gsubfn)
text |> 
  gsubfn("\\w+", ~ if (grepl("[0-9]", x)) paste(x, "\n") else x, x = _) |>
  read.table(text = _, sep = ":", strip.white = TRUE)

相关问题