R语言基础(七):文件处理
创始人
2024-06-02 03:10:29

R语言基础(一):注释、变量
R语言基础(二):常用函数
R语言基础(三):运算
R语言基础(四):数据类型
R语言基础(五):流程控制语句
R语言基础(六):函数

8. 文件处理

8.1 csv文件

​ csv文件是一种简单的文本文件,它有行列形式,但不像Excel那么复杂,csv文件是一个纯文本文件,但可以当做表格使用,列与列之间用英文逗号隔开。创建一个name.csv文件

姓名,性别,年龄
张三,男,20
李四,女,19
王五,男,25

8.1.1 读取csv

使用R读取csv文件:

> setwd("D:/")  #设置当前目录
> data <- read.csv("name.csv")  #读取文件,如果有中文会乱乱码
Warning message:
In read.table(file = file, header = header, sep = sep, quote = quote,  :incomplete final line found by readTableHeader on 'name.csv'
> data濮撳悕     鎬у埆 骞撮緞
1 寮犱笁 鐢,20     NA
2 鏉庡洓 濂,19     NA
3 鐜嬩簲 鐢,25     NA
#加上encoding解决中文乱码问题,在文件末尾加一个空行消除Warning message
> data <- read.csv("name.csv", encoding = 'UTF-8')
> data姓名 性别 年龄
1 张三   男   20
2 李四   女   19
3 王五   男   25
> 

读取csv的结果data是一个数据帧data frame类型,对数据帧所有的操作都适用

> str(data)
'data.frame':   3 obs. of  3 variables:$ 姓名: chr  "张三" "李四" "王五"$ 性别: chr  "男" "女" "男"$ 年龄: int  20 19 25
> age <- age(data$年龄)  #最大年龄
> age
[1] 25

8.1.2 写入csv

用write.csv()写入文件

> data <- read.csv("name.csv", encoding = 'UTF-8')
#创建一个新行
> newrow = data.frame(姓名 = c("小明"),性别 = c("男"),年龄 = c(19))
#在原来数据帧中写一行
> data = rbind(data,newrow)
> data姓名 性别 年龄
1 张三   男   20
2 李四   女   19
3 王五   男   25
4 小明   男   19
#保存文件row.names = FALSE去掉前面的1234
> write.csv(data,"new.csv", row.names = FALSE)

保存后的文件:

"姓名","性别","年龄"
"张三","男",20
"李四","女",19
"王五","男",25
"小明","男",19

8.2 Excel文件

安装依赖包

> any(grepl("xlsx",installed.packages()))  #验证是否安装
[1] FALSE  #没安装
> install.packages("xlsx")   #开始安装
--- 在此連線階段时请选用CRAN的鏡子 ---
还安装相依关系‘rJava’, ‘xlsxjars’
> library("xlsx")  #加载软件包

准备一个excel文件,data.xlsx

月份交通费办公损耗人力成本结算日期
1月17.8454.1827.982020/1/31
2月18.2135.146.692020/2/28
3月46.6318.1235.252020/3/31
4月35.8948.5715.542020/4/29
5月47.013.4249.572020/5/30
6月36.831.4261.752020/6/30
7月8.7143.5547.742020/7/31

8.2.1 读取excel

读取Excel的时候如果有中文需要加encoding参数,否则会报错:

> data = read.xlsx("D:/data.xlsx",sheetIndex=1) #中文要加encoding
Error in make.names(vnames, unique = TRUE) : 多字节字符串3有错
> data = read.xlsx("D:/data.xlsx",sheetIndex=1,encoding = "UTF-8")
> data月份 交通费 办公损耗 人力成本   结算日期
1  1月  17.84    54.18    27.98 2020-01-31
2  2月  18.21    35.10    46.69 2020-02-28
3  3月  46.63    18.12    35.25 2020-03-31
4  4月  35.89    48.57    15.54 2020-04-29
5  5月  47.01     3.42    49.57 2020-05-30
6  6月  36.83     1.42    61.75 2020-06-30
7  7月   8.71    43.55    47.74 2020-07-31

8.2.2 写入excel

> newrow = data.frame(月份 = c("8月"),交通费 = c(10),办公损耗 = c(20),人力成本 = c(30),结算日期 = c('2020-08-30'))
> data = rbind(data,newrow)  #加入一行
> write.xlsx(data,"new.xlsx", row.names = FALSE) #写新文件
#在原文件追加一个sheet
> write.xlsx2(data,"data.xlsx", row.names = FALSE,append=TRUE,sheetName="Sheet2")
> 

8.3 XML文件

安装xml依赖的包

> install.packages("XML")
> library("XML")

准备xml文件user.xml

1张三2李四

8.3.1 读取xml文件

#加载xml
> data = xmlParse(file="user.xml") 
#提取根节点
> root=xmlRoot(data)
#获取子节点个数
> xmlSize(root)
[1] 2
#读取第一个节点
> root[1]
$user
1张三
 
#读取第一个节点的第二个属性
> root[[1]][[2]]
张三 #将数据转成list
> list_data <- xmlToList(data)
#将数据转成data frame
> data=xmlToDataFrame("user.xml")
> dataid name
1  1 张三
2  2 李四

8.3.2 写入xml

安装依赖包

> install.packages("Runiversal")
> library(Runiversal)
#写入
cat(makexml(data),file = "options.xml")

8.4 JSON文件

​ JSON全名是JavaScript Object Notation(JavaScript 对象表示法)。现在JSON不只局限在JavaScript中,各种编程语言都对JSON提供了支持,JSON也是网络传输中很重要的一种格式。可以把JSON理解为符合一定格式的字符串。

​ JSON是以key-value形式存储的数据,大括号{}用于包裹对象,中括号[]用于包裹集合(类似于list和array的数据)。key就是属性名,可以用引号包裹,value就是属性值,String类型的值用引号包裹,key和value之间用英文冒号:隔开。

准备数据data.json

{"name" : ["张三","李四","王五"],"age" : [20,25,28]
}

安装JSON包

> install.packages("rjson")
> library("rjson")> json=fromJSON(file="data.json")
> data=data.frame(json)
> dataname age
1 张三  20
2 李四  25
3 王五  28
> 

也可以使用另一个包,支持更好一些

> install.packages("jsonlite")
> library(jsonlite)  #注意切换包
> data=fromJSON("data.json")
#数据转换成json
> json=toJSON(data,pretty=TRUE)
#写入文件
> cat(json, file = (con <- file('n.json', "w", encoding = "UTF-8")))
> close(con)

8.5 MySQL数据库

MySQL是一种常用的非关系型数据库。

在test库中准备数据表dept

    id  name       
------  -----------1  技术部  2  测试部  3  商务部  4  运营部  5  财务部  6  拓展部  
#安装库
> install.packages("RMySQL")
> library(RMySQL)
> conn = dbConnect(MySQL(), user = 'xx', password = 'xx', dbname = 'xx',host = 'localhost')
> dbSendQuery(conn,'SET NAMES gbk')  #解决中文乱码
> result = dbSendQuery(conn, "select * from dept")  #查询
> data=fetch(result, n = 2)   #取结果集前两条
> dbClearResult(result)  #关闭结果集
#添加数据
> dbSendQuery(conn,"insert into dept(name) values('行政部')")
> dbDisconnect(conn)  #关闭连接

相关内容

热门资讯

老干妈“味道变了”?回应来了 (来源:都市现场)近日,“老干妈为节省成本味道变了”的话题引发网友热议。有消费者反映老干妈味道变了,...
敏感时刻,美国媒体突然怒斥白宫... 转自:北京日报客户端曾威胁伊朗政府不得对伊朗国内的“抗议者”采取措施,否则就会出兵干涉的美国白宫,如...
乌克兰国防部长、国家安全局局长... 北京青年报2026-01-13 23:51:18当地时间13日,乌克兰最高拉达(议会)在全体会议上未...
2男1女专盗寺庙功德箱,警方披... 1月14日,据辽宁葫芦岛公安消息:近日,市局南票分局成功打掉一个流窜多省专门盗窃寺庙功德箱的犯罪团伙...
奉贤金海街道举办创新挑战赛,让... (来源:上观新闻)“以往找外包公司做品牌推广,成本高但未必贴合年轻群体需求,没想到这场赛事能汇集那么...