2015-01-12 4 views
2

у меня есть тысячи файлов из определенного каталога:Использование R, Получить файлы, имена файлов, которые содержат определенные строки

filenames <- list.files("D:/MessData_Source", pattern="*.DAT", full.names=TRUE) 
..... 
..... 

    [9998] "D:/MessData_Source/908-A0F7__01310012567794F.DAT" 
    [9999] "D:/MessData_Source/908-A0F7__01310015662858F.DAT" 
    [10000] "D:/MessData_Source/908-A0F7__01310015662859F.DAT" 

.... 
.... 

Из этих более 1000 файлов, мне нужно извлечь только те файлы, с именами файлов, которые содержат определенные строки.
например.

filename_extracted <- list() 
for (i in 1:length(filenames)) 
{ 
    # search for those filenames that contain the strings with PartNo and MoNo and store in results 
    filename_extracted[[i]] <- substr(filenames[i],31,43) 
} 

Выше я извлечение строки имен файлов из числа 31, 43 и сохранить его в filename_extracted что-то вроде этого:

[[9993]] 
[1] "1856955908850" 

[[9994]] 
[1] "1856955933372" 

[[9995]] 
[1] "1856955933372" 

[[9996]] 
[1] "1856955954613" 

[[9997]] 
[1] "1856955954613" 

[[9998]] 
[1] "1310012567794" 

[[9999]] 
[1] "1310015662858" 

[[10000]] 
[1] "1310015662859" 

Далее необходимо сравнить filename_extracted моего требуемого список , и скопируйте соответствующие файлы в другой каталог.

required_list <- list() 
df <-read.csv("PartNo_MoNo.csv") # full set 
for (i in 1:length(df)) 
{ 
    required_list[[i]] <- paste(df[i,1],df[i,2], sep="") 
} 
> required_list 
[[1]] 
[1] "1235235987252" 

[[2]] 
[1] "1897865985468" 

Если имеется совпадение между required_list и filename_extracted, я хочу, чтобы скопировать соответствующие файлы в другой каталог, как мне это сделать?

спасибо.

ответ

1

Вот обновленный код, полностью векторизация:

filename_extracted = substr(filenames, start=31, stop=43) 
prefix    = substr(filesnames, start=20, stop=30) 
required_list  = paste0(df[,1], df[,2]) 

common_suffix  = intersect(filename_extracted, required_list) 
common_prefix  = prefix[filename_extracted %in% common] 

storeDir = "D:/MessData_Source" 
otherDir = "D:/OrderedData_Source" 

if(length(common!=0)) 
{ 
    commonFile = paste0(common_prefix, common_suffix, ".DAT") 

    sapply(commonFile, function(u){ 
     file.copy(file.path(storeDir,u), file.path(otherDir, u)) 
    }) 
} 

Перед выполнением этого, убедитесь, otherDir создан.

+0

Привет полковник Beauvel & Dieter Menne, спасибо за оба ваши ответы, я понимаю ваш код ... но мне нужно внести некоторые изменения ..., так как первые 10 символов, не всегда «908-A0F7__». Это может быть «908-A0F7__01310015662859F.DAT» или «908-A062__01042105733247P.DAT» или «908-A050_A01042045683782P.DAT» или «108-0626_B09120015857047A.DAT» или «258-5141_B01963555909713F.DAT» или «108-0626_B09120015774259A.DAT», , Мы видим, что имя файла всегда содержит 29 символов, включая расширение .DAT. –

+0

Отредактировано для этого эффекта! В следующий раз упомянем об этом в вашем вопросе;) –

+0

извините ... Мне все равно нужно также извлечь последние 5 символов ... и добавить в commonFile ... suffix = substr (имена файлов, start = 44, stop = 48) # последние 5 символов .... commonFile = paste0 (common_prefix, common_suffix, suffix) sapply (commonFile, function (u) { file.copy (file.path (storeDir, u), file.path (otherDir, u)) над кодами не работает, он копирует все. –

0
# Create data 
library(stringr) 

lapply(1:10, function(x){ 
    write.csv(head(iris),file=paste0("908-A0F7__",x,".csv")) 
    write.csv(head(iris),file=paste0("notused__",x,".csv")) 
}) 
# Only get files with correct pattern 
pattern = "908-A0F7__(\\d+).csv" 
files = data.frame(name=dir(pattern=pattern,full.names=TRUE)) 
files$num = as.integer(str_match(filenames$name,pattern)[,2]) 
required = c(1,3,5) # You can also read this in from your csv 

myFiles = files[files$num %in% required,] 

dir.create("copied") 
file.copy(as.character(myFiles$name),file.path("copied",str_sub(myFiles$name,3))) 
+0

Привет, полковник Бовель и Дитер Менн, поэтому мы видим, что нам нужно получить какие-то правильные индексы для тех, , так что он может извлечь правильные первые 11 символов и последние 5 символов (один алфавит +. DAT) и вернуть их в свои имена файлов. –

Смежные вопросы