R批量导入不同子目录CSV出现embedded nul in string错误如何解决
解决方案
报错原因
Agilent Chemstation导出的CSV默认使用UTF-16LE编码,R默认读取编码不匹配,才会识别出嵌入空字节触发警告。
实现步骤
1. 环境准备
加载所需工具包:
library(tidyverse)
2. 自定义读取函数
函数同时完成「读取适配编码的文件」、「提取所属子目录名」、「新增标识列」三个操作:
read_agilent_csv <- function(file_path) { # 拆分路径提取目标子目录名 # 路径结构为:[1]一级目录/[2]二级目录/[3]三级目录/[4]REPORT01.CSV # 调整[]内的数字即可选择不同层级的目录作为标识: # 填1取最上层的210119/210122类目录,填3取REF TTO-xxx.D类目录 sub_dir <- str_split(file_path, "/", simplify = TRUE)[, 1] # 读取文件,指定编码匹配Chemstation导出规则 df <- read_csv( file = file_path, locale = locale(encoding = "UTF-16LE"), show_col_types = FALSE ) %>% mutate(文件所属子目录 = sub_dir) # 列名可自行修改 return(df) }
3. 批量读取合并所有文件
final_tbl <- tto_refs %>% map_dfr(read_agilent_csv)
异常兼容方案
如果仍有少量文件报空值错误,修改读取部分的代码,先过滤空字节再读取:
read_agilent_csv <- function(file_path) { sub_dir <- str_split(file_path, "/", simplify = TRUE)[, 1] # 先读取行并过滤空字节 file_lines <- readLines( con = file_path, encoding = "UTF-16LE", skipNul = TRUE ) df <- read_csv(file_lines, show_col_types = FALSE) %>% mutate(文件所属子目录 = sub_dir) return(df) }
内容的提问来源于stack exchange,提问作者Phenomniverse
相关产品推荐
相关产品推荐

