R中读取包含中文字符的文件时这个诡异的错误你见过吗?

2022-01-18 21:29:52 浏览数 (2)

我们有一个文件,里面写了一些中文信息,命名为chinese.txt,内容为

代码语言:javascript复制
Train   Time
转录组开课时间 2021/10/29-2021/10/31
临床基因组学开课时间  2021/11/12-2021/11/14
宏基因组开课时间    2021/11/19-2021/11/21
扩增子开课时间 2022/01/07-2022/01/09

尝试读入R,报错 line 2 did not have 2 elements 很诡异的提示!!!

如果我们一直去数列数,这是怎么都不会发现问题的。考虑到大多数程序语言对非英文支持不好,考虑是编码格式问题。

代码语言:javascript复制
train <- read.table('chinese.txt')

Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, : line 2 did not have 2 elements

解决方案1:指定编码格式

正确的读了进来

代码语言:javascript复制
train <- read.table('chinese.txt', fileEncoding = "utf-8", header=T)
train

##                  Train                  Time
## 1       转录组开课时间 2021/10/29-2021/10/31
## 2 临床基因组学开课时间 2021/11/12-2021/11/14
## 3     宏基因组开课时间 2021/11/19-2021/11/21
## 4       扩增子开课时间 2022/01/07-2022/01/09

解决方案2:用readr包里面的read_tsv

这个使用更方便,适用范围也更广。有时在read.table中即使指定了fileEncoding = "utf-8"参数后依然解决不了问题的文件,用readr毫无压力。

代码语言:javascript复制
library(readr)
readr::read_tsv('chinese.txt')

## 
## -- Column specification --------------------------------------------------------------------------
## cols(
##   Train = col_character(),
##   Time = col_character()
## )

## # A tibble: 4 x 2
##   Train                Time                 
##   <chr>                <chr>                
## 1 转录组开课时间       2021/10/29-2021/10/31
## 2 临床基因组学开课时间 2021/11/12-2021/11/14
## 3 宏基因组开课时间     2021/11/19-2021/11/21
## 4 扩增子开课时间       2022/01/07-2022/01/09

解决方案3:用data.table包里面的fread

需要手动指定编码格式

代码语言:javascript复制
library(data.table)
# UTF-8 大小写敏感
fread('chinese.txt', encoding = "UTF-8")

##                   Train                  Time
## 1:       转录组开课时间 2021/10/29-2021/10/31
## 2: 临床基因组学开课时间 2021/11/12-2021/11/14
## 3:     宏基因组开课时间 2021/11/19-2021/11/21
## 4:       扩增子开课时间 2022/01/07-2022/01/09

0 人点赞