You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 07:33:16