正则表达式将原始文本转换为数据列

时间:2014-04-25 15:35:52

标签: regex r grep

我有一个程序的原始文本输出,我想将其转换为DataFrame。文本文件未格式化,如下所示。

 10037    149439Special Event       11538.00       13542.59   2004.59
 10070     10071Weekday        8234.00        9244.87   1010.87
 10216     13463Weekend        145.00              0   -145.00

我可以使用基础包中的R将数据读入readLines()。如何将其转换为看起来像这样的数据(列名可以是任何东西)。

 A        B         C              D              E          F
 10037    149439    Special Event  11538.00       13542.59   2004.59
 10070     10071    Weekday        8234.00         9244.87   1010.87
 10216     13463    Weekend        145.00                0   -145.00

我应该使用什么正则表达式来实现这一目标?我知道这非常适合应用regexec()regmatches()的组合。但是我无法想出一个将该行分成所需组件的表达式。

3 个答案:

答案 0 :(得分:5)

这是一个简单的解决方案:

raw <- readLines("filename.txt")
data.frame(do.call(rbind, strsplit(raw, " {2,}|(?<=\\d)(?=[A-Z])", perl = TRUE)))

#       X1     X2            X3       X4       X5      X6
# 1  10037 149439 Special Event 11538.00 13542.59 2004.59
# 2  10070  10071       Weekday  8234.00  9244.87 1010.87
# 3  10216  13463       Weekend   145.00        0 -145.00

正则表达式" {2,}|(?<=\\d)(?=[A-Z])"由两部分组成,与"|"(逻辑)相结合。

  1. " {2,}"表示至少有两个空格。这将仅在不同列之间拆分,因为第三列中的文本只有一个空格。
  2. "(?<=\\d)(?=[A-Z])"表示以数字开头,后跟大写字母的位置。这用于在第二列和第三列之间进行拆分。

答案 1 :(得分:3)

我从您的数据中创建了"txt.txt"。然后我们用正则表达式来处理。

> read <- readLines("txt.txt")
> S <- strsplit(read, "[A-Za-z]|\\s")
> W <- do.call(rbind, lapply(S, function(x) x[nzchar(x)]))
> D <- data.frame(W[,1:2], col, W[,3:5])
> names(D) <- LETTERS[seq(D)]
> D
##       A      B            C        D        E       F
## 1 10037 149439 SpecialEvent 11538.00 13542.59 2004.59
## 2 10070  10071      Weekday  8234.00  9244.87 1010.87
## 3 10216  13463      Weekend   145.00        0 -145.00

将所有内容折叠成一些大括号,您就可以自己解析文件了。

PS :如果&#34;特殊&#34;之间的空格和&#34;事件&#34;很重要,请评论,我会修改。

答案 2 :(得分:0)

Something like this至少适合你的榜样,但我不知道你所有的角落......

([0-9]+) +([0-9]+)(.+) ([0-9.-]+) +([0-9.-]+) +([0-9.-]+)

从1到6的捕获组是分别。你的专栏从A到F.