如何正确导入含单引号的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
相关产品推荐
相关产品推荐

