如何在SAS或R中创建符合国家死亡索引标准的固定宽度文本文件
固定宽度文本文件生成方案(SAS/R)
问题背景
需要生成每条记录100个字符宽度的无表头文本文件,用于国家死亡索引获取死亡日期。此前用SAS合并列后通过proc export导出的.txt文件,在记事本中列宽无法正确对齐,要求严格保留规定宽度且无表头。
示例数据集
Abei Ghador 07 16 1992 Aziz Patrick 07 01 1947 Ali Theodore 07 01 1966 Abdelrahman Baker A 05 01 1966 Abd Farik 11 01 1971 Abele Mat A 04 01 1994
原SAS代码问题
原代码通过多次merge合并数据集,但proc export默认生成分隔符分隔的文本(而非固定宽度格式),导致列对齐失效:
data combinedAoDB; merge LastName1 FirstName2 ;run; data combinedAoDB; merge combinedAoDB MIDDLEINITIAL3 SSN4 MONTHBIRTH5 DAYBIRTH6 YEARBIRTH5;run; data combinedAoDB; merge combinedAoDB FATHERSURNAME8 AGEUNITdeath9 NUMBERAGEUNITSdth_10 SEX_11 RACE_12 MARITALSTATUS_13 STATEOFRESIDENCE_14;run; data combinedAoDB; merge combinedAoDB STATEOFBIRTH_15 CONTROLIDNUMBER_16 OPTIONALUSERDATA_17 BLANKFIELD_18;run; proc contents data=combinedAoDB;run; proc export data=work.combinedAoDB outfile='new 3 combinedAoDB.txt' replace; putnames=no; run;
SAS 解决方案
要生成严格固定宽度的文本,需用data _null_配合put语句手动定义每个变量的宽度,确保总长度为100字符。
示例代码
/* 需替换为国家死亡索引要求的实际字段宽度,以下为示例分配 */ data _null_; set work.combinedAoDB; file 'fixed_width_output.txt' lrecl=100; /* 强制每条记录长度100 */ /* 按固定宽度输出变量,@符号保持不换行,最后自动换行 */ put LastName1 $20. /* 姓:左对齐,占20位 */ FirstName2 $15. /* 名:左对齐,占15位 */ MIDDLEINITIAL3 $1. /* 中间名首字母:占1位 */ SSN4 $9. /* 社保号:右对齐,占9位 */ MONTHBIRTH5 $2. /* 出生月:占2位 */ DAYBIRTH6 $2. /* 出生日:占2位 */ YEARBIRTH5 $4. /* 出生年:占4位 */ /* 依次添加其他字段,按要求分配宽度 */ @100 ' '; /* 补空格确保总长度为100 */ run;
关键说明
lrecl=100指定每条记录的固定长度为100字符$n.对应字符型变量占n位,数值型用n.(默认右对齐)- 所有字段宽度总和需等于100,或通过
@100 ' '补全剩余空格 - 用记事本查看时,需切换为等宽字体(如Courier New)才能看到对齐效果
R 解决方案
R中可通过专用函数或手动格式化字符串生成固定宽度文本。
方法1:使用gdata::write.fwf
# 安装并加载依赖包 install.packages("gdata") library(gdata) # 定义各字段的固定宽度(需匹配实际要求) col_widths <- c( LastName1 = 20, FirstName2 = 15, MIDDLEINITIAL3 = 1, SSN4 = 9, MONTHBIRTH5 = 2, DAYBIRTH6 = 2, YEARBIRTH5 = 4, BLANKFIELD_18 = 47 # 补全剩余宽度至100 ) # 导出固定宽度文件,无表头 write.fwf(your_combined_data, file = "fixed_width_output.txt", widths = col_widths, col.names = FALSE, rownames = FALSE, justify = "left") # 字符型左对齐,数值型可设为"right"
方法2:手动格式化字符串
# 安装并加载stringr包处理字符串填充 install.packages("stringr") library(stringr) # 假设your_combined_data是合并后的数据集 df <- your_combined_data # 手动拼接每行的固定宽度字符串 df$fixed_line <- with(df, paste0( str_pad(LastName1, width = 20, side = "right"), # 左对齐补空格 str_pad(FirstName2, width = 15, side = "right"), str_pad(MIDDLEINITIAL3, width = 1, side = "right"), str_pad(SSN4, width = 9, side = "left"), # 右对齐补空格 str_pad(MONTHBIRTH5, width = 2, side = "left"), str_pad(DAYBIRTH6, width = 2, side = "left"), str_pad(YEARBIRTH5, width = 4, side = "left"), str_pad("", width = 47, side = "right") # 补剩余空格到100位 )) # 导出每行内容,无表头 writeLines(df$fixed_line, con = "fixed_width_output.txt")
关键说明
- 需确保所有字段宽度总和为100
- 同样需切换至等宽字体查看对齐效果
内容的提问来源于stack exchange,提问作者Mohamed Rahouma
相关产品推荐
相关产品推荐

