R: получить список коротких имен файлов (имен файлов) для всех файлов в каталоге - PullRequest
0 голосов
/ 30 апреля 2019

Задача

list.files(Path) возвращает вектор имен файлов в каталоге Path. Это здорово, но мне нужен вектор коротких имен файлов (SFN). Например, SFN для WageDataFile.csv имеет вид WAGEDA ~ 1.csv (если в каталоге нет другого файла со стеблем "WageDa"). SFN также называется именем файла 8.3.

Желаемое решение

В частности, я надеюсь на функцию, которая будет извлекать SFN из ОС, а не восстанавливать его по выходным данным list.files() (но методы для восстановления SFN по выходным данным list.files() также приветствуются).

Код для воспроизводимого случая

Это создаст набор файлов в «E: / FileNameTest» с длинами имен переменных:

setwd("E:/FileNameTest")
library(stringi)
nFiles = 12
minNameLength = 2
maxNameLength = 12
set.seed(1)
FileNames = 
    stri_rand_strings(nFiles, 
                length=sample(minNameLength:maxNameLength,nFiles,replace=T), 
                '[A-Za-z0-9]')
file.create(FileNames)

Вот содержание FileNames:

 [1] "lUizNmvDe7"   "GN0Nr"        "LTbUBpfn"     "6i"           "Poe"          "mYWm1Tjg"    
 [7] "TrRF46JWfPuI" "SKe"          "FTl5sLqLKTtr" "OmxQ"         "iO"           "KkCi7F" 

Вот список SFN, который мне нужен из этих имен файлов (редактировать: сокращенные имена должны быть во всех заглавных буквах):

[1] "6i"       "FTL5SL~1" "GN0Nr"    "iO"       "KkCi7F"   "LTbUBpfn" "LUIZNM~1" "mYWm1Tjg" "OmxQ"    
[10] "Poe"      "SKe"      "TRRF46~1"

1 Ответ

0 голосов
/ 01 мая 2019

Вот решение (на основе комментария от MrFlick), которое может опираться на неверные предположения о выводе dir. В частности, я предполагаю, что верхний и нижний колонтитулы вывода всегда занимают 5 и 2 строки соответственно, и что ширина полей в выводе dir /x/a:-d всегда постоянна.

library(stringr)
FileList = shell("dir /x/a:-d", intern=T)
FileList = FileList[6:(length(FileList)-2)]
SFN = str_replace(str_sub(FileList, 39, 46), "        ", "")
Name = str_sub(FileList, 52, -1)
NameList = ifelse(str_length(SFN)>0, SFN, Name)
...