从具有已知行号的文本文件的中间选择文本

时间:2014-10-26 00:14:45

标签: r

我写了一些R代码来对我的研究项目进行分析。我编写它的方式是有一个输出文本文件,其中包含程序的状态。现在输出文件的标题如下所示:

start time: 2014-10-23 19:15:04 
starting analysis on state model: 16 
current correlation state: 1 
>>>em_prod_combs 
em_prod_combs 
H3K18Ac_H3K4me1 1.040493e-50 
H3K18Ac_H3K4me2 3.208806e-77 
H3K18Ac_H3K4me3 0.0001307375 
H3K18Ac_H3K9Ac 0.001904384 

'>>> em_prod_combs“在第4行第5行再次重复(R代码)。我想要数据来自6。这个数据继续36行,所以在第42行结束然后文件中还有一些其他文本,直到像742一样,看起来像这样:

 (742) >>>em_prod_combs 
 (743) em_actual_perc 
 (744) H3K18Ac_H3K4me1 0 
H3K18Ac_H3K4me2 0 
H3K18Ac_H3K4me3 0.0001976819 
H3K18Ac_H3K9Ac 0.001690382

我再次想要从第744行(实际数据,而不是标题)中选择数据,再去另外36行并在第780行结束。这是我的部分代码:

filepath <- paste(folder_directory, corr_folders[fi], filename, sep="" )
     con <- file(filepath) 
     open(con);
     results.list <- list();
     current.line <- 0
     while (length(line <- readLines(con, n = 1, warn = FALSE)) > 0) {
       if(line==">>>em_prod_combs"){
         storethenext <- TRUE
       }
     } 
     close(con)

在这里,我试图查看读取的行是否具有“&gt;&gt;&gt;”标记。如果是这样,请将变量设置为TRUE并将后36行(使用另一个计数器变量)存储在数据框或列表中,并将storethenext变量设置回F。我有点希望有更好的方法来做到这一点......

2 个答案:

答案 0 :(得分:1)

所以我意识到ReadLines有一个参数可以设置为跳过线。基于此,我得到了这个:

df <- data.frame(name = character, 
                 params = numeric(40),                               
                 stringsAsFactors = FALSE)

con <- file(filepath) 
open(con);
results.list <- list();
current.line <- 0
firstblock <- readLines(con, n = 5, warn = FALSE)
firstblock <- NULL #throwaway
firstblock <- readLines(con, n = 36, warn = FALSE)
firstblock <- as.list(firstblock) #convert to list
for(k in 1:36){
  splitstring = strsplit(firstblock[[k]], " ", fixed=TRUE)
  ## put the data in the df
}

但是从Ben的回答可以看出,read.table可以在同一行中做同样的事情:所以我把它减少到下面的一个班轮:

firstblock2 <- read.table(filepath, header = FALSE, sep = " ", skip = 5, nrows = 36)

这也使得它成为一个数据框架,并为我做了所有肮脏的工作。 read.table的文档在这里: https://stat.ethz.ch/R-manual/R-devel/library/utils/html/read.table.html

答案 1 :(得分:0)

tidyverse readr中 如果您不希望将数据转换为数据框,则可以使用read_lines()读取文本切片   (一定要注意n_max =参数是要求读入多少行;而不是要停止的行数.tbh:最后我也发现这更好,因为通常我需要管理文件长度超过我需要隔离读入的代码段。)

firstblock <- read_lines(filepath, skip = 5, n_max = 31)

如果您不想考虑文件大小,可以修改代码:

start_line = 5
end_line = 36
line_count = end_line - start_line

firstblock <- read_lines(filepath, skip = start_line, n_max = line_count)

在任何情况下,我发现在发现这篇文章之后我更了解它们后,我发现有助于使用这些文件格式的其他内容:

如果您想立即将文件转换为列表,请使用:

read_lines_raw(filepath, skip = 5, n_max = 31) 

你将获得一个31元素列表作为你的firstblock元素,而不是你用第一个元素获得的字符元素。

我在那里偶然发现了其他超酷的功能(并被移动分享 - 因为我认为他们摇滚):

  • 会自动解压缩.gz.bz2.xz.zip个文件。
  • 如果文件路径以http://https://ftp://ftps://开头,
  • 将自动建立连接并完成下载。
  • 如果文件同时具有扩展名和前缀,那么它会同时执行。

如果事情需要回到原点,那么使用基本版本write_lines功能会更加愉快。具体来说,没有FileConn可以打开和关闭:只需指定对象和您希望将其写入的文件名。

所以例如下面的内容:

fileConn <- file("directory/new.sql")
writeLines(new_sql, fileConn)
close(fileConn)

只是:

write_lines(new_sql, "directory/new.sql")

享受,希望这会有所帮助!