首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >欺负人的公共数据+1(编码方式utf-16)

欺负人的公共数据+1(编码方式utf-16)

作者头像
小洁忘了怎么分身
发布2025-12-20 16:09:20
发布2025-12-20 16:09:20
60
举报
文章被收录于专栏:生信星球生信星球

1.问题数据

GSE309870是个转录组数据,他的表达矩阵的编码方式有问题,传统的几个读取方式都扑街了,encode参数只能和设置 latin1、UTF-8、bytes、unknown这几种。而该文件是UTF-16!

代码语言:javascript
复制
a = read.delim("GSE309870_TPM_all_Sample.txt")
代码语言:javascript
复制
## Warning in read.table(file = file, header = header, sep =
## sep, quote = quote, : line 1 appears to contain embedded
## nulls
代码语言:javascript
复制
## Warning in read.table(file = file, header = header, sep =
## sep, quote = quote, : line 2 appears to contain embedded
## nulls
代码语言:javascript
复制
## Warning in read.table(file = file, header = header, sep =
## sep, quote = quote, : line 3 appears to contain embedded
## nulls
代码语言:javascript
复制
## Warning in read.table(file = file, header = header, sep =
## sep, quote = quote, : line 4 appears to contain embedded
## nulls
代码语言:javascript
复制
## Warning in read.table(file = file, header = header, sep =
## sep, quote = quote, : line 5 appears to contain embedded
## nulls
代码语言:javascript
复制
## Error in make.names(col.names, unique = TRUE): invalid multibyte string at '<ff><fe>e'
代码语言:javascript
复制
a = data.table::fread("GSE309870_TPM_all_Sample.txt")
代码语言:javascript
复制
## Error in data.table::fread("GSE309870_TPM_all_Sample.txt"): 文件编码是UTF-16,fread()不支持此编码。请 将文件转换为UTF-8。
代码语言:javascript
复制
a = rio::import("GSE309870_TPM_all_Sample.txt")
代码语言:javascript
复制
## Error in (function (input = "", file = NULL, text = NULL, cmd = NULL, : 文件编码是UTF-16,fread()不支持此编码。请 将文件转换为UTF-8。

好不容易哈德雷大神的readr支持utf-16了!但是还是咔咔报错,不好解决。

代码语言:javascript
复制
library(readr)
a = read_table("GSE309870_TPM_all_Sample.txt",
               locale = locale(encoding = "UTF-16"))
代码语言:javascript
复制
## Error: Incomplete multibyte sequence

与其和这些报错打架,还不如换个方式,转换一下编码方式试试。

2.转换编码方式

用excel应该也能搞定,我懒得去试,还是R语言搞定香,不然多几个文件一个个手动转换也是麻烦啊。

utf-8编码方式是可以读取的,但是我不会转换,得靠ai,试了两次就搞定了~

代码语言:javascript
复制
convert_utf16_to_utf8 <- function(src, dst,
                                  endian = c("little","big")) {
  endian  <- match.arg(endian)
  cs      <- if (endian == "little") "UTF-16LE"else"UTF-16BE"
  con_in  <- file(src,  "rb")
  con_out <- file(dst, "wb")
  open(con_in); open(con_out)
while (length(buf <- readBin(con_in, "raw", n = 1e6))) {
    txt <- iconv(list(buf), from = cs, to = "UTF-8")
    writeBin(charToRaw(txt), con_out)
  }
  close(con_in); close(con_out)
}

convert_utf16_to_utf8("GSE309870_TPM_all_Sample.txt", "GSE309870_TPM_all_Sample_utf8.txt")
代码语言:javascript
复制
## Warning in open.connection(con_in): connection is already
## open
代码语言:javascript
复制
## Warning in open.connection(con_out): connection is
## already open

再次读取就没问题了。

代码语言:javascript
复制
library(data.table)
代码语言:javascript
复制
DT <- fread("GSE309870_TPM_all_Sample_utf8.txt")
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-12-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信星球 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.问题数据
  • 2.转换编码方式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档