【发布时间】:2018-07-06 22:22:16
【问题描述】:
我有一个包含文件路径和名称的数据框,格式如下:
files_list <- c(
"C:/User/Name/Folder/Subfolder1/Sub-subfolder/file.txt",
"C:/User/Name/Folder/Subfolder1/Sub-subfolder/file - Copy.txt",
"C:/User/Name/Folder/Subfolder1/Sub-subfolder/file (1).txt",
"C:/User/Name/Folder/Subfolder1/Sub-subfolder/file - Copy (2).txt",
"C:/User/Name/Folder/Subfolder1/fileB.txt",
"C:/User/Name/Folder/file.C.txt",
"C:/User/Name/Folder/file-D.txt",
"C:/User/Name/Folder/file",
"C:/User/Name/Folder/file Z.txt",
"C:/User/Name/Folder/file - backup.txt"
)
每个文件都有一个父文件夹和一个名称。这些名称可能包含一个或多个句点“.”。和/或破折号“-”。此外,有些具有“复制”符号、编号指定和/或文件扩展名。我想将数据转换为如下所示:
[1] "Sub-subfolder file txt"
[2] "Sub-subfolder file Copy txt"
[3] "Sub-subfolder file 1 txt"
[4] "Sub-subfolder file Copy 2 txt"
[5] "Subfolder1 fileB txt"
[6] "Folder file.C txt"
[7] "Folder file-D txt"
[8] "Folder file"
[9] "Folder file Z txt"
[10] "Folder file - backup txt"
这是我认为应该可以解决问题的代码:
sub(
"(^.:/)([^/.]+/)*([^/.]+/)([^/]+)(\\s-\\sCopy)?(\\s\\(([0-9]+)\\))?(\\.([^.]+))?$",
"\\3 \\4 \\5 \\7 \\9",
files_list
)
但我得到的是:
[1] "Sub-subfolder/ file.txt "
[2] "Sub-subfolder/ file - Copy.txt "
[3] "Sub-subfolder/ file (1).txt "
[4] "Sub-subfolder/ file - Copy (2).txt "
[5] "Subfolder1/ fileB.txt "
[6] "Folder/ file.C.txt "
[7] "Folder/ file-D.txt "
斜线“/”和多余的空格我可以处理,但“复制”符号、数字名称和文件扩展名并没有像我预期的那样分开。
关于如何识别“复制”符号、数字名称和文件扩展名有什么建议吗?还是应该只在一行代码中标识父文件夹,然后在另一行中分隔其余文件夹?
(最终,我要将这些文本字符串转换为一个数据框,其中文件夹、文件名、复制名称和扩展名是单独的列。我很确定我可以用tidyr::separate 做到这一点,但即使这需要了解正则表达式,我想学习如何使用() 和反向引用。)
【问题讨论】:
-
不要用评论来澄清问题。 编辑问题以澄清它。删除评论。
-
dirname、basename和tools::file_ext -
我在 寻找
tools::file_ext,但我一直忘记tools默认不在搜索路径中。 (但我认为,这个问题的难点在于Copy和数字等的特殊情况。) -
Josh,你用这个抽象的单字符串 thingamajig 做什么?它没有分栏,因此表格格式不能很好地(或一致地)工作;它不支持文件访问,所以自动化已经过时了; ... ??
标签: r regex backreference