我想 :
從目錄中讀取*.txt檔案的串列
從目錄中讀取*.txt檔案的串列
對于我的檔案夾中的所有.txt檔案,我想使用所有*.txt檔案(例如,下面的Hox.txt和zinc.txt)中第五列的所有行id=NAME中包含的資訊
使用一個單獨的查找表將id值與Family值聯系起來,確定給定檔案屬于哪個族(例如cram-2)(例如,下面的查找表)
將所有具有相同族的檔案(如HOX.txt和Zinc.txt)合并/concatenate為一個.txt檔案。
用族這一列的名稱保存鏈接的檔案(如cram-2.txt)。
! 提醒!! !! R將不得不在大量和沉重的.txt檔案上作業 - 需要一個臨時目錄嗎?
例子:
HOX.txt檔案行 :
ma reg out fim id=HOX;seq=AGCAGGAAATA; score=12。 1915;pval=4.97e-05。
se reg out fim id=HOX;seq=AGCAGGAAATA; score=12. 1915;pval=4.97e-05。
to reg out fim id=HOX;seq=AGCAGGAAATA; score=12. 1915;pval=4.97e-05。
pa reg out fim id=HOX;seq=AGCAGGAAATA; score=12. 1915;pval=4.97e-05。
鋅.txt檔案的行數 :
ma reg out fim id=zinc;seq=AGCAGGAAATA; score=12. 1915;pval=4.97e-05。
se reg out fim id=zinc;seq=AGCAGGAAATA; score=12. 1915;pval=4.97e-05。
to reg out fim id=zinc;seq=AGCAGGAAATA; score=12. 1915;pval=4.97e-05。
pa reg out fim id=zinc;seq=AGCAGGAAATA; score=12. 1915;pval=4.97e-05。
查詢表 :
Name Family
HOX cram-2
zinc cram-2
火燒sf.xr
fire ra.XS-2
...繼續...
我搜索到的最終輸出結果是:
a) 檔案名 = cram-2.txt
b) 將HOX.txt和Zinc.txt串聯起來,因為這兩個檔案都是來自Family cram-2!ma reg out fim id=HOX;seq=AGCAGGAAATA; score=12。 1915;pval=4.97e-05。
se reg out fim id=HOX;seq=AGCAGGAAATA; score=12. 1915;pval=4.97e-05。
to reg out fim id=HOX;seq=AGCAGGAAATA; score=12. 1915;pval=4.97e-05。
pa reg out fim id=HOX;seq=AGCAGGAAATA; score=12. 1915;pval=4.97e-05。
ma reg out fim id=zinc;seq=AGCAGGAAATA; score=12. 1915;pval=4.97e-05。
se reg out fim id=zinc;seq=AGCAGGAAATA; score=12. 1915;pval=4.97e-05。
to reg out fim id=zinc;seq=AGCAGGAAATA; score=12. 1915;pval=4.97e-05。
pa reg out fim id=zinc;seq=AGCAGGAAATA; score=12. 1915;pval=4.97e-05。
代碼在少數檔案上作業,只有床。
我試著使用tempfile()和tempdir(),但仍然沒有成功。
uj5u.com熱心網友回復: 試試這段代碼。 在 根據你的需要,對 P.S.
我建議你注意,我使用了最快的已知函式來讀寫 讓我知道這是否是它,以及它的作業速度如何。
標籤:dfNameFamily = tibble()
名稱= 作為。 字符(df$Name),
家族 = as.character(df$Family)
dir = "~/textfiles"
TxtFile = function(dir) dir_ls(dir, regexp = ". txt$")
readTxt = function(FileName) {
行=字符()
if(file_exists(FileName)){
con = file(FileName, 打開= "r")
lines = readLines(con)
close(con)
}
線條
}
GetName = function(l) Str_match(l, "; id=(. ); seq")[1,2]
SaveFile = function(l。 name, dir){
con = file(paste0(dir。 "/" , name))
writeLines(unlist(l$lines)。 con)
close(con)
}
tibble(FileName = TxtFile(dir)) %> %
mutate()
lines = map(FileName, readTxt),
名稱= map_chr(lines, GetName)) %> %
left_join(dfNameFamily, by="Name") %> %
group_by(Family) %> %
group_walk(SaveFile,dir)
bedDir目錄中收集要處理的檔案。為輸出檔案創建一個目錄bedOut。最好將其放在一個RStudio專案中,在那里創建這些目錄。
Names和Families向量進行相應的擴展。library(data.table)
library(tidyverse)
library(fs)
library(utils)
名稱 = c("HOX"。 "鋅", "火"。 "fire2")
家庭 = c("cram-2"。 "cram-2", "sf. xr", "ra.XS-2")
GetName = function(l) str_match(l, "id=(. ); seq")[1,2]
GetFamily = function(l)/span> Families[which(Names==GetName(l))】
BedFile = 函式(dir) dir_ls(dir。 regexp = ". bed$")
info = function(txt, start_time, end_time){
tdif = end_time - start_time
tunit = " ms"/span>
if(tdif>=1000){
tdif = tdif/1000
tunit = " s"/span>
}
cat(paste0("Read ", txt," (", round(tdif, 2),tunit,")
"))
}
time_ms = function() as. numeric(as.numeric(Sys. time()*1000, 數字=15)。
pbTitle = function(path, files, i){
paste("[", round(i/length(files)*100。 0),"%]",
"檔案已從",路徑,"目錄 "中讀取。
"正在讀取的檔案。 ", files[i])}
bedDir = "bedDir"
bedOut = "bedOut"/span>
files = BedFile(bedDir)
if(length(files)> 0){
start_time = time_ms()
pb = winProgressBar(max = winningProgressBar(max) operator">= length(files)。 寬度= 500)
on. exit(close(pb)。 添加= TRUE)
for(i in 1。 length(files)){
setWinProgressBar(pb, i-1, pbTitle(bedDir, files。 i-1))
行 = fread(text = files[i] 。 sep = "|"/span>。 header=FALSE)
名稱 = GetName(lines[1)
家族= GetFamily(lines[1])
fileName = paste0(bedOut。 "/", Family, " 。 bad")
fwrite(lines, fileName。 append = file_exists(fileName))
}。
close(pb)
info(paste(length(files)。 "files"), start_time。 time_ms())
}。
fread和fwrite文本檔案,這些函式來自這里的data.table包。
