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

如何正确导入含单引号的TXT文件至SAS数据集?

解决SAS导入含单引号及内嵌分隔符文本文件的问题

这个问题的核心是SAS默认的DSD选项只识别双引号作为字段的引用字符,但你的数据里用了单引号来包裹包含分隔符(|)的字段,同时需要保留字段本身的单引号(比如FORLI'),导致解析混乱。

下面提供两种针对性的解决方案,根据你的需求选择:

方案1:完整保留字段内的所有单引号

如果你需要把'80S WERE GREAT|FORLI'这类带包裹单引号的内容完整作为字段值,可以使用scan函数的引用模式来解析整行记录:

libname mylib "/my/lib";
data prova;
  infile '/my/lib/prova.txt' lrecl=50 truncover;
  length line $50;
  /* 先读取整行原始内容 */
  input line $;
  
  /* 用scan的'q'修饰符处理引号内的分隔符,同时保留所有单引号 */
  codice = scan(line, 1, '|', 'q');
  nome = scan(line, 2, '|', 'q');
  luogo = scan(line, 3, '|', 'q');
  importo = input(scan(line, 4, '|', 'q'), 4.);
  
  format codice $3. nome $20. luogo $20. importo 4. ;
run;
  • scan函数的第四个参数'q'会启用引用扫描模式:它会自动忽略单引号/双引号内部的分隔符,同时完整保留字段两端的引号,完美匹配你的数据格式。
  • 最后用input函数把importo的字符值转换为数值型。

方案2:保留字段内容但去掉包裹字段的单引号

如果你只需要保留字段内的单引号(比如FORLI'),但想去掉包裹整个字段的单引号(比如把'80S WERE GREAT|FORLI'处理成80S WERE GREAT|FORLI),可以修改infile语句的quote选项:

libname mylib "/my/lib";
data prova;
  /* 用quote=''''指定单引号为引用字符(SAS中两个单引号表示一个实际单引号) */
  infile '/my/lib/prova.txt' dlm='|' dsd lrecl=50 truncover quote=''';
  format codice $3. nome $20. luogo $20. importo 4. ;
  input codice :$3. nome :$20. luogo :$20. importo :4. ;
run;
  • quote=''''告诉SAS把单引号当作字段的引用符,配合DSD选项,会自动忽略单引号内部的|,同时去掉字段两端的包裹单引号。
  • 这种方法更贴近你原来的代码结构,适合不需要保留外层包裹单引号的场景。

两种方案都能解决解析混乱的问题,你可以根据实际需求选择。

内容的提问来源于stack exchange,提问作者CarLaTeX

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 16:54:04