递归提取文本文件中的值并循环遍历更多文本文件,并重新排列行和列

问题描述:

我想基于正则表达式模式从几百个txt文件中提取值,重新排列这些值并将它们写入数据帧。递归提取文本文件中的值并循环遍历更多文本文件,并重新排列行和列

文件的开头开始是这样的:http://pastebin.com/embed_js.php?i=vdbXfDhC

结束这样的:http://pastebin.com/embed_js.php?i=hse7SDJd

我有一个类似的问题早(Rearranging the structure of many txt files and then merging them in one data frame) 其中RAWR与此代码为我提供了:

(lf <- list.files('~/desktop', pattern = '^image\\d+.txt', full.names = TRUE)) 
# [1] "/Users/rawr/desktop/image001.txt" "/Users/rawr/desktop/image002.txt" 
# [3] "/Users/rawr/desktop/image003.txt" 

res <- lapply(lf, function(xx) { 
    rl <- readLines(con <- file(xx), warn = FALSE) 
    close(con) 
    img_name <- gsub('.*file:\\s+(.*).tif', '\\1', rl[1]) 
    rl <- rl[-(1:grep('==', rl))] 
    rl <- gsub('^\\s+', '', rl) 
    mat <- do.call('rbind', strsplit(rl, '\\s{2, }')) 
    dat <- as.data.frame(mat, stringsAsFactors = FALSE) 
    tmp <- `colnames<-`(do.call('rbind', strsplit(dat$V2, '[-\\/\\s]+', perl = TRUE)), 
         c('Foreground','Data pixels')) 
    dat <- cbind(dat[, -2], tmp, image_name = img_name) 
    dat[] <- lapply(dat, as.character) 
    dat[dat == ''] <- NA 
    names(dat)[1:2] <- c('MSPA-class','Frequency') 

    zzz <- reshape(dat, direction = 'wide', idvar = 'image_name', timevar = 'MSPA-class') 
    names(zzz)[-1] <- gsub('(.*)\\.(.*) (?:.*)', '\\2_\\1', names(zzz)[-1], perl = TRUE) 
    zzz 
}) 

但是,这段代码使用的是每个文件只有一个分析步骤的txt文件,现在我在一个.log文件中有很多分析,如pastebin示例所示e(1/745 ...等),所以我不能使用相同的循环。

有人可以帮我适应上面贴提取

1)MeshSize代码:XXX [哈哈] 2)相对。碎片:XXX 3)MeshSize comp.time [sec]:XXX

对于每个图像(例如,============== 703/745 ======== ======表示图像名称出现在路径中的新图像)

与我的其他问题类似,我需要重新排列数据,以便图像名称(以.tif结尾的路径中的字符串: 20130815 225017 957 000000 0892 0464)是行名称(我不需要.tif结尾)和1)MeshSize [ha],2)rel。碎片3)MeshSize comp.time [sec]是列。

image name 1) mesh size 2)..... 3)...... 
    row1    xx  xx  xx 
    row2 

编辑RAWR的伟大的解决方案

如果你想在一个循环了整个事情,并保存为CSV,你可以做这样的:

lf = list.files(path="xx", pattern = '^batch_mesh8\\d.log', full.names = TRUE) 

mesh2<-NULL 

for (i in lf) 
{ 

#rawr's code here: 

#final lines of code: 
mesh1<-cbind(data.frame('image_name' = img_names), mat) 
mesh2 <- rbind(mesh2, mesh1) 
} 
write.csv(mesh2, file = "all_mesh_th8.csv") 

我觉得这一个更直截了当。 (或者我做了比其他问题更难)

path <- '~/desktop/log.log' 
x <- readLines(con <- file(path)) 
close(con) 

# m <- gregexpr('(\\d+/\\d+)', x, perl = TRUE) 
# img_names <- head(unlist(regmatches(x, m)), -1) 
# completed <- tail(img_names, 1) 

y <- x[grepl('File', x)] 
img_names <- basename(gsub('File: ', '', gsub('\\\\+','/', y), perl = TRUE)) 
img_names <- gsub('\\.([[:alnum:]]+)$','', img_names) 

(x <- x[grepl('\\d+\\.\\d+', x)]) 

# [1] "MeshSize: 0.30289606 [ha]; rel. fragmentation: 83.1300" 
# [2] "MeshSize comp.time [sec]: 0.00099992752"    
# [3] "MeshSize: 0.39157622 [ha]; rel. fragmentation: 81.4600" 
# [4] "MeshSize comp.time [sec]: 0.00099992752"    
# [5] "MeshSize: 0.45971902 [ha]; rel. fragmentation: 76.8700" 
# [6] "MeshSize comp.time [sec]:  0.00000000"    
# [7] "MeshSize: 0.032965344 [ha]; rel. fragmentation: 94.5500" 
# [8] "MeshSize comp.time [sec]:  0.00000000"    
# [9] "MeshSize: 0.034653125 [ha]; rel. fragmentation: 93.6300" 
# [10] "MeshSize comp.time [sec]:  0.00000000"    
# [11] "MeshSize: 0.74313322 [ha]; rel. fragmentation: 90.2700" 
# [12] "MeshSize comp.time [sec]: 0.00099992752"    
# [13] "MeshSize: 0.48677515 [ha]; rel. fragmentation: 85.5700" 
# [14] "MeshSize comp.time [sec]: 0.00099992752" 

nums <- unlist(regmatches(x, gregexpr('\\d+\\.\\d+', x, perl = TRUE))) 
mat <- matrix(nums, ncol = 3, byrow = TRUE, 
       dimnames = list(NULL, c('Mesh size','rel frag','comp time'))) 
cbind(data.frame('image_name' = img_names), mat) 

#        image_name Mesh size rel frag  comp time 
# 1 20130815 143656 507 000000 0952 0536 0.30289606 83.1300 0.00099992752 
# 2 20130815 143657 673 000002 0244 0284 0.39157622 81.4600 0.00099992752 
# 3 20130815 143657 706 000000 0764 0304 0.45971902 76.8700 0.00000000 
# 4 20130815 143658 806 000000 0776 0672 0.032965344 94.5500 0.00000000 
# 5 20130815 143700 005 000000 0232 0116 0.034653125 93.6300 0.00000000 
# 6 20130815 225020 589 000000 0188 0564 0.74313322 90.2700 0.00099992752 
# 7 20130815 225033 917 000000 0288 0804 0.48677515 85.5700 0.00099992752 
+0

很好,几乎在那里。只是图像的名称不应该是1/745等,而是路径字符串的最后部分(例如,20130815 143657 673 000002 0244 0284)。我想在那之后,我可以很容易地将它打包成一个循环以获取多个日志文件并将它们绑定!太感谢了! – 2015-04-03 02:12:39

+0

啊,我没有很好地阅读问题,我忘了循环。这可能比我做的更容易。如果你有文件路径,'?basename'会提取文件名(带扩展名);那么如果你愿意,你可以分出这个扩展(见编辑) – rawr 2015-04-03 02:33:24