USPS TXT文件按规则拆分及字段解析技术求助
用R语言解析USPS固定长度TXT记录
1. 拆分以Z开头的182字符记录
由于文件是连续长文本,read.table会将所有内容读入同一行,我们可以先读取整个文件为字符串,再通过正则拆分出每条符合要求的记录:
# 读取完整文件内容 raw_content <- readChar("918.txt", file.info("918.txt")$size) # 利用正向预查正则拆分所有以Z开头的片段 all_records <- strsplit(raw_content, "(?=Z)", perl = TRUE)[[1]] # 清理无效记录:过滤空字符串和长度不符的条目 valid_records <- all_records[nzchar(all_records) & nchar(all_records) == 182]
2. 解析Z后的固定长度字段
USPS记录为固定长度格式,直接用substr按位置提取Z后的各字段即可(以下为示例,需根据实际USPS记录规范调整字段位置):
# 解析为数据框 parsed_data <- data.frame( # 示例字段:Z后第1-5位为记录ID(对应字符串位置2-6) record_id = substr(valid_records, 2, 6), # 示例字段:Z后第6-10位为邮政编码(对应字符串位置7-11) zip_code = substr(valid_records, 7, 11), # 示例字段:Z后第11-14位为投递点编码(对应字符串位置12-15) delivery_point = substr(valid_records, 12, 15), # 按需添加其他字段,参考USPS官方文档的字段位置定义 stringsAsFactors = FALSE )
批量处理多份TXT文件
如果有多个USPS文件,用循环或lapply批量处理并合并结果:
# 获取所有目标TXT文件路径 file_paths <- list.files(path = "./usps_files", pattern = "\\.txt$", full.names = TRUE) # 批量处理每个文件 all_results <- lapply(file_paths, function(file) { raw <- readChar(file, file.info(file)$size) records <- strsplit(raw, "(?=Z)", perl = TRUE)[[1]] valid <- records[nzchar(records) & nchar(records) == 182] data.frame( source_file = basename(file), record_id = substr(valid, 2, 6), zip_code = substr(valid, 7, 11), # 其他字段... stringsAsFactors = FALSE ) }) # 合并所有文件的解析结果 final_dataset <- do.call(rbind, all_results)
注意事项
- 正则
(?=Z)是正向预查断言,确保在每个Z字符前拆分,不会破坏记录开头的Z;需开启perl = TRUE才能生效。 - 字段位置必须严格匹配USPS对应记录格式的官方定义,不同类型的USPS文件(如NCOA Link、DPV)字段布局不同。
内容的提问来源于stack exchange,提问作者samrdbar
相关产品推荐
相关产品推荐

