R:从文件

时间:2016-01-16 15:29:22

标签: regex r

这是一个文件模式

metastring: time1, a,b,c,d,f
144135 42435 345425 2342423
263766 35553 353453 3534553
355345 52454 525252 2423465
245466 45645 355345 6454556
355662 26397 353577 3558676
metastring: time2, a,c,d,f
224234 23423 324234 4242324
312323 13123 312312 1312321
246456 63564 646544 4456456
244424 53556 546456 4645645
元序串由时间戳组成,a,b,c,d是指数字串的名称(例如“a”指的是块的第一个数字串)。数字字符串是固定宽度但它们的数量不是常量,取决于元字符串。 我想要的是一个像这样结构化的data.frame:

time1 a 144135 42435 345425 2342423
time1 b 263766 35553 353453 3534553
time1 c 355345 52454 525252 2423465
time1 d 245466 45645 355345 6454556
time1 f 355662 26397 353577 3558676
time2 a 224234 23423 324234 4242324
time2 c 312323 13123 312312 1312321
time2 d 246456 63564 646544 4456456
time2 f 244424 53556 546456 4645645

或者能够通过匹配元串格式和读取两个元串之间的线来一次读取一个块。无法找到一种方法,因为gsubfn read.pattern似乎一次只能读取一行文件而且我得不到比metastring更多的东西。

1 个答案:

答案 0 :(得分:2)

要获得数据帧,可以使用Sub onIndexChanged(sender As Object, e As EventArgs) Dim b As ComboBox = CType(sender, System.Windows.Forms.ComboBox) If b.Equals(b1) Then If b1.SelectedIndex = -1 Then b2.Enabled = False b3.Enabled = False Else b2.Enabled = True b3.Enabled = False b2.Items.Clear() b3.Items.Clear() b2.Items.AddRange(b1.Items.Cast(Of String)() _ .Where(Function(x) x <> b1.SelectedItem.ToString()).ToArray()) End If Else if b.Equals(b2) Then If b2.SelectedIndex <> -1 Then b3.Items.Clear() b3.Items.AddRange(b2.Items.Cast(Of String)(). _ Where(Function(x) x <> b2.SelectedItem.ToString()).ToArray()) b3.Enabled = True b3.SelectedIndex = 0 End If End If End Sub ,然后对字符串进行一些后处理。在您的代码中,将readLines()替换为您的文件名。

textConnection(text)

数据:

## read the file
dat <- readLines(textConnection(text))
## find the 'metastring' lines
meta <- grepl("metastring", dat, fixed = TRUE)
## split the 'metastring' lines for the first two columns
## then create the first two columns
f2cols <- do.call(
    "rbind", 
    lapply(
        strsplit(dat[meta], "(.*: )|, ?"), 
        function(x) cbind(text1 = x[2], text2 = tail(x, -2))
    )
)
## create the final data frame
cbind(f2cols, read.table(text = dat[!meta]))
#   text1 text2     V1    V2     V3      V4
# 1 time1     a 144135 42435 345425 2342423
# 2 time1     b 263766 35553 353453 3534553
# 3 time1     c 355345 52454 525252 2423465
# 4 time1     d 245466 45645 355345 6454556
# 5 time1     f 355662 26397 353577 3558676
# 6 time2     a 224234 23423 324234 4242324
# 7 time2     c 312323 13123 312312 1312321
# 8 time2     d 246456 63564 646544 4456456
# 9 time2     f 244424 53556 546456 4645645