从北卡选举网站读取TXT文件遇嵌入空值等错误求助
北卡罗来纳州选举数据导入R的问题解决
问题原因
- 编码不匹配:NCSBE提供的选举结果TXT文件采用UTF-16LE编码,用默认的UTF-8/ASCII编码读取时,双字节字符的低字节会被识别为
null(\0),触发"embedded nulls"错误。 - 文件格式非分隔符类型:这些文件是固定宽度格式,不是常规的制表符/逗号分隔文件,
read.delim这类分隔符读取函数无法正确解析列结构,导致第2-5行格式异常。 - 末尾行无换行符:UTF-16LE编码文件末尾通常缺少换行符,触发
readTableHeader的"incomplete final line"错误。
解决办法
方法1:使用read_fwf读取固定宽度文件(推荐)
tidyverse的readr包提供的read_fwf专门处理固定宽度文件,配合指定编码可完美解析:
library(tidyverse) # 1. 先读取文件行确认列结构(可选,用于核对列宽) file_content <- read_lines( "https://s3.amazonaws.com/dl.ncsbe.gov/ENRS/2020_11_03/results_precinct_sort/PAMLICO_PRECINCT_SORT.txt", locale = locale(encoding = "UTF-16LE") ) head(file_content) # 2. 根据NCSBE官方数据字典设置列宽(示例,需按实际字段调整) col_spec <- fwf_cols( county_code = 3, precinct_code = 6, contest_id = 5, candidate_id = 5, vote_count = 6, office_code = 3, party_code = 3, remaining_fields = -1 # 匹配剩余所有内容,后续可拆分 ) # 3. 读取文件,处理编码和末尾行问题 election_data <- read_fwf( "https://s3.amazonaws.com/dl.ncsbe.gov/ENRS/2020_11_03/results_precinct_sort/PAMLICO_PRECINCT_SORT.txt", col_positions = col_spec, locale = locale(encoding = "UTF-16LE"), skip_empty_rows = TRUE, trim_ws = TRUE ) # 查看解析结果 glimpse(election_data)
方法2:用read.table兼容处理
如果不想手动设置列宽,可通过read.table配合编码和填充参数绕过错误:
library(tidyverse) election_data <- read.table( "https://s3.amazonaws.com/dl.ncsbe.gov/ENRS/2020_11_03/results_precinct_sort/PAMLICO_PRECINCT_SORT.txt", fileEncoding = "UTF-16LE", fill = TRUE, # 自动填充不完整的行 skip_empty_rows = TRUE, stringsAsFactors = FALSE, header = FALSE # 这类文件无表头,需后续手动命名列 ) # 手动添加列名(参考NCSBE数据字典) colnames(election_data) <- c("county_code", "precinct_code", "contest_id", "candidate_id", "vote_count", ...)
关键说明
- 列宽信息可从NCSBE官网的数据字典文档获取,确保每个字段的宽度匹配,避免解析错位。
skip_empty_rows = TRUE和fill = TRUE是解决末尾行错误的核心参数,前者跳过空行,后者自动补全行缺失的内容。
内容的提问来源于stack exchange,提问作者Powell Sheagren
相关产品推荐
相关产品推荐

