楼主: kiddbai
26173 16

[学习分享] 利用R进行文件操作(文件重命名等) [推广有奖]

  • 0关注
  • 11粉丝

博士

本科生

96%

还不是VIP/贵宾

-

威望
0
论坛币
7002 个
通用积分
34.1305
学术水平
44 点
热心指数
41 点
信用等级
31 点
经验
1341 点
帖子
79
精华
0
在线时间
162 小时
注册时间
2005-8-24
最后登录
2024-1-10
毕业学校
中国人民大学

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
昨晚遇到了这样的问题,给老爸弄了30多GB的单田芳评书全集,准备弄到iPhone上给他听,当然不可能都搞上去,一次也就弄个几部,都够听上好多天的。在整理的过程中,出现了问题:
问题一:老爸看到有好多评书分别装在各自的文件夹(60多个)中,让我把这些文件夹的名字打出来,他好从里面选;
问题二:先选了“乱世枭雄”后,里面的文件名为:“乱世枭雄(1).mp3 …… 乱世枭雄(301).mp3”,而在iTunes里面的排列顺序是:
乱世枭雄(1).mp3
乱世枭雄(10).mp3
乱世枭雄(11).mp3
……
乱世枭雄(2).mp3
乱世枭雄(20).mp3
乱世枭雄(21).mp3
……
乱世枭雄(301).mp3
所以,作为评书的话,这样导如iPhone后没法听了,应该把文件名改为“乱世枭雄(001).mp3”,这样的话就可以在iTunes里面正常排序了。

开始有点儿头大,不知道该怎么办,一个一个弄有点儿麻烦,显然不可取,于是想到了R,在Google上稍作研究后,很快搞定了两个问题,以下是我的解决办法,与大家交流,如果觉得搞得太弱智还请多包涵!

假设:评书MP3的文件夹都存放在“D:\评书”下,评书《乱世枭雄》都存放在“D:\评书\乱世枭雄”下。

解决方案一:用过使用dir()函数就可以将文件夹中的内容显示出来,转为data.frame就可以写入一个文本文件进行编辑、打印等一般性操作,代码如下:
  1. dir1 <- "D:\\评书"
  2. setwd(dir1) #将要查看文件夹名称的文件夹设为当前工作目录
  3. fl <- dir() #将目录列表赋值给变量
  4. fl <- as.data.frame(fl) #将变量转为data.frame以便执行后面的写入操作,此步骤也可与上面一并执行
  5. write.table(fl, file="评书目录.txt", quote=F, col.names=F) #将数据框fl写入文本文件,由于写入时会有引号,所以加参数去掉,列名称被去掉了,或者可以改成想要的列名称,另外如果不想要每一行的序号还可以加入“row.names=F”
复制代码


解决方案二:这个问题的解决其实就是把这一文件夹中的所有评书MP3文件名列表想象成一个向量,然后对这个向量进行操作,把它改为我们想要的文件名列表,最后利用file.rename()函数进行修改。过程如下:
步骤一:准备工作
首先要准备好被赋值的原始文件名向量,观察特征,并转为character。
  1. dir2 <- "D:\\评书\\乱世枭雄"
  2. setwd(dir2)
  3. fl_1 <- dir()
  4. fl_2 <- as.character(fl_1)
复制代码

通过观察fl_2,可以看到,在R里面其顺序也为:
乱世枭雄(1).mp3
乱世枭雄(10).mp3
乱世枭雄(11).mp3
……
乱世枭雄(2).mp3
乱世枭雄(20).mp3
乱世枭雄(21).mp3
……
乱世枭雄(301).mp3
当然,这并不重要,我们只需要直接对其进行文本操作就可以了。
步骤二:修改文件名列表
其实这一步的目的就是对字符串向量fl_2进行查找替换操作,将“乱世枭雄(1).mp3”等改为“乱世枭雄(001).mp3”,再将“乱世枭雄(10).mp3”等改为“乱世枭雄(010).mp3”,这样的话目的就达到了,这里要用些简单的正则表达式和gsub()函数,代码如下:
  1. fl_2 <- gsub("(\\()([0-9]{1})(\\))", "\\100\\2\\3", fl_2) #查找“(1)”等,并改为“(001)”至“(009)”
  2. fl_2 <- gsub("(\\()([0-9]{2})(\\))", "\\10\\2\\3", fl_2) #查找“(10)”等,并改为“(010)”至“(099)”
复制代码

此时,查看fl_2就会看到已经变为:
乱世枭雄(001).mp3
乱世枭雄(010).mp3
乱世枭雄(011).mp3
……
乱世枭雄(002).mp3
乱世枭雄(020).mp3
乱世枭雄(021).mp3
……
乱世枭雄(301).mp3
而且顺序没有变,这样就可以进行重命名操作。
步骤三:文件重命名
由于fl_1是dir()直接赋值过来,因此其代表了系统文件名,而fl_2的顺序与fl_1一一对应,仅仅是对字符串进行了查找替换操作,因此可以放心利用file.rename()重命名文件,代码如下:
  1. file.rename(fl_1, fl_2) #函数形式为file.rename(from, to),from为原始文件名向量,to为新的文件名向量
复制代码

稍等片刻,就会看到文件名已经改好了,具体时间视修改数量,但其实我改了300多个文件也就是一瞬间的事儿。

结语
上述提到的函数当然都可以用“?函数名”的方式查看,特别是用“?file.rename”查看时,会看到很多文件操作的函数,各位可以做进一步研究。从这个操作例子就可以看出,作为强大的统计软件,R的功能其实可以大大扩展,因为其在向量运算和其他操作方面具有很大的优势,利用这一优势,对字符数据进行操作、整理,甚至是处理一些比较乱得原始txt和csv文档都很有帮助,效率极大提高。例如,我现在就编了一个.r文件,每天帮我整理下载的数据,比原来在Excel上面操作快得多。
最后,还是希望大家多提宝贵意见,高手走过笑过,需要帮助的朋友有一点启发我就很开心了,呵呵!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:文件操作 iphone iTunes Google Phone 命名

已有 4 人评分学术水平 热心指数 信用等级 收起 理由
胡老 + 5 + 5 + 5 观点有启发
杨花点点 + 1 + 1 赞美技术帖
kk22boy + 1 + 1 + 1 就需要这样的技术贴
dxystata + 1 观点有启发

总评分: 学术水平 + 7  热心指数 + 8  信用等级 + 6   查看全部评分

本帖被以下文库推荐

沙发
sunhd 发表于 2011-10-6 16:14:25 |只看作者 |坛友微信交流群
请问这个R是个什么工具?

使用道具

藤椅
kiddbai 发表于 2011-10-6 17:02:04 |只看作者 |坛友微信交流群
统计软件,参考www.r-project.org

使用道具

板凳
qoiqpwqr 发表于 2011-10-6 23:50:54 |只看作者 |坛友微信交流群
楼主很有钻研精神,顶一个。

使用道具

报纸
ktorresjie 发表于 2011-10-9 16:06:48 |只看作者 |坛友微信交流群
没想到R也能这么用,前阵子还为这好好折腾了一下!

使用道具

地板
ktorresjie 发表于 2011-10-9 16:08:41 |只看作者 |坛友微信交流群
没想到R也能这么用,前阵子还为这好好折腾了一下!

使用道具

7
kiddbai 发表于 2011-10-9 21:29:39 |只看作者 |坛友微信交流群
ktorresjie 发表于 2011-10-9 16:08
没想到R也能这么用,前阵子还为这好好折腾了一下!
嗯,原来我也没想到,只能说R的潜力太大了!

使用道具

8
issac.you 发表于 2015-1-22 09:51:44 |只看作者 |坛友微信交流群
非常好
很感谢

使用道具

9
十年行川 发表于 2015-1-24 11:59:50 |只看作者 |坛友微信交流群
  1. fl_1 <- dir("rain01/")
  2. fl_2 <- as.character(fl_1)
  3. fl_2 <- gsub("dat", "asc", fl_2)
  4. file.rename(fl_1,fl_2)
复制代码
为什么用您这段代码修改后,想实现将rian01文件夹下的所有文件的格式改成*.asc格式,实现不了,求教!
  1. > fl_1 <- dir("rain01/")
  2. > fl_1
  3. [1] "201001.asc" "201002.dat" "201003.dat" "201004.dat" "201005.dat"
  4. [6] "201006.dat" "201007.dat" "201008.dat" "201009.dat" "201010.dat"
  5. [11] "201011.dat" "201012.dat"
  6. > fl_2 <- as.character(fl_1)
  7. > fl_2
  8. [1] "201001.asc" "201002.dat" "201003.dat" "201004.dat" "201005.dat"
  9. [6] "201006.dat" "201007.dat" "201008.dat" "201009.dat" "201010.dat"
  10. [11] "201011.dat" "201012.dat"
  11. > fl_2 <- gsub("dat", "asc", fl_2)
  12. > fl_2
  13. [1] "201001.asc" "201002.asc" "201003.asc" "201004.asc" "201005.asc"
  14. [6] "201006.asc" "201007.asc" "201008.asc" "201009.asc" "201010.asc"
  15. [11] "201011.asc" "201012.asc"
  16. > file.rename(fl_1, fl_2)
  17. [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
复制代码

使用道具

10
a524631266 在职认证  发表于 2015-2-13 14:50:39 |只看作者 |坛友微信交流群
R语言魅力十足

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-2 00:34