R 3.5无法读取UTF-16格式CSV文件,R 3.4.3可正常执行
R 3.5.0读取UTF-16制表文件时出现"no lines available in input"的解决办法
背景问题
我有一段读取ASIC公开数据的R代码,在R 3.4.3版本中完全正常运行:
read.csv("http://asic.gov.au/Reports/YTD/2018/RR20180420-001-SSDailyYTD.csv", skip=1, fileEncoding = "UTF-16", sep = "\t", header = FALSE)
但升级到R 3.5.0后,直接抛出错误:
Error in read.table(file = file, header = header, sep = sep, quote = quote, : no lines available in input
我的R 3.5.0环境信息:
R version 3.5.0 (2018-04-23) Platform: x86_64-w64-mingw32/x64 (64-bit) Running under: Windows >= 8 x64 (build 920...)
问题根源
查了R 3.5.0的更新日志和社区讨论后发现,新版本在处理远程URL的编码解析逻辑上做了调整:
- 基础包的
read.table(read.csv的底层函数)对UTF-16编码的字节顺序标记(BOM)识别更严格 - 直接从HTTP URL读取文件时,编码转换的中间步骤可能出现数据丢失,导致读取到空内容
可行解决方案
方案1:先下载到本地再读取(最稳妥)
绕开远程读取的编码问题,先把文件以二进制形式下载到本地临时文件,再进行读取:
# 创建临时文件路径 temp_file <- tempfile(fileext = ".csv") # 二进制下载文件,避免编码损坏 download.file("http://asic.gov.au/Reports/YTD/2018/RR20180420-001-SSDailyYTD.csv", destfile = temp_file, mode = "wb") # 读取本地文件 df <- read.csv(temp_file, skip=1, fileEncoding = "UTF-16", sep = "\t", header = FALSE) # 清理临时文件 unlink(temp_file)
mode = "wb"是关键,确保Windows系统不会把UTF-16文件当成普通文本文件进行转换,破坏原有的编码结构。
方案2:调整编码参数和读取选项
尝试明确指定UTF-16的字节序(比如小端UTF-16LE),同时关闭引号解析避免不必要的干扰:
df <- read.table("http://asic.gov.au/Reports/YTD/2018/RR20180420-001-SSDailyYTD.csv", skip=1, fileEncoding = "UTF-16LE", sep = "\t", header = FALSE, quote = "")
R 3.5.0对引号的解析逻辑更严格,如果文件里存在不规则的引号,会导致读取中断,quote = ""可以跳过这个检查步骤。
方案3:用readr包替代基础函数
readr包的读取工具对编码兼容性更好,而且支持远程URL直接读取,不受基础R版本变更的影响:
# 如果未安装readr包先执行安装 install.packages("readr") library(readr) df <- read_tsv("http://asic.gov.au/Reports/YTD/2018/RR20180420-001-SSDailyYTD.csv", skip = 1, locale = locale(encoding = "UTF-16"), col_names = FALSE)
read_tsv专门处理制表分隔文件,locale参数能精准指定编码,读取效率也比基础函数更高。
验证方法
运行完代码后,执行head(df)查看前几行数据,确认没有空行、乱码问题,就说明读取成功了。
内容的提问来源于stack exchange,提问作者cephalopod
相关产品推荐
相关产品推荐

