楼主: kiddbai
1514 4

[R] 利用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:\评书\乱世枭雄”下。


R文件解决方案



      解决方案一:
      用过使用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上面操作快得多。
      最后,还是希望大家多提宝贵意见,高手走过笑过,需要帮助的朋友有一点启发我就很开心了,呵呵!

二维码

扫码加我 拉你入群

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

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

关键词:文件操作 iTunes iphone Google IPHON 文件操作 修改文件名

已有 3 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
xddlovejiao1314 + 100 + 100 + 5 + 5 + 5 精彩帖子
niuniuyiwan + 60 + 60 + 2 + 1 + 1 精彩帖子
我的素质低 + 40 精彩帖子

总评分: 经验 + 160  论坛币 + 200  学术水平 + 7  热心指数 + 6  信用等级 + 6   查看全部评分

本帖被以下文库推荐

沙发
xddlovejiao1314 学生认证  发表于 2015-9-24 11:19:20 |只看作者 |坛友微信交流群
好贴,谢谢分享。
已有 1 人评分论坛币 热心指数 收起 理由
niuniuyiwan + 10 + 1 精彩帖子

总评分: 论坛币 + 10  热心指数 + 1   查看全部评分

使用道具

藤椅
海的方向 发表于 2015-11-6 14:09:13 |只看作者 |坛友微信交流群
有意思 程序员改变生活
已有 2 人评分经验 论坛币 热心指数 收起 理由
xddlovejiao1314 + 10 + 3 鼓励积极发帖讨论
niuniuyiwan + 10 + 1 精彩帖子

总评分: 经验 + 10  论坛币 + 13  热心指数 + 1   查看全部评分

使用道具

板凳
Alfred_G 学生认证  发表于 2016-1-26 15:51:38 |只看作者 |坛友微信交流群
好贴,mark~
已有 1 人评分经验 论坛币 收起 理由
xddlovejiao1314 + 10 + 3 鼓励积极发帖讨论

总评分: 经验 + 10  论坛币 + 3   查看全部评分

使用道具

报纸
Akybat 发表于 2016-3-16 20:29:50 |只看作者 |坛友微信交流群
楼主想法真高

使用道具

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

本版微信群
加好友,备注jltj
拉您入交流群

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

GMT+8, 2024-11-5 07:52