R语言基础(七):文件处理

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 寮犱笁 鐢<b7>,20     NA
2 鏉庡洓 濂<b3>,19     NA
3 鐜嬩簲 鐢<b7>,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

<users>
  <user>
    <id>1</id>
    <name>张三</name>
  </user>
  <user>
    <id>2</id>
    <name>李四</name>
  </user>
</users>
8.3.1 读取xml文件
#加载xml
> data = xmlParse(file="user.xml") 
#提取根节点
> root=xmlRoot(data)
#获取子节点个数
> xmlSize(root)
[1] 2
#读取第一个节点
> root[1]
$user
<user>
  <id>1</id>
  <name>张三</name>
</user> 
#读取第一个节点的第二个属性
> root[[1]][[2]]
<name>张三</name> 

#将数据转成list
> list_data <- xmlToList(data)
#将数据转成data frame
> data=xmlToDataFrame("user.xml")
> data
  id 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)
> data
  name 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)  #关闭连接

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

专治八阿哥的孟老师

您的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值