含/和,混合分隔符的CSV文件导入及SAS导入报错解决
我来帮你搞定这个导入报错的问题!你遇到的NOTE: Invalid dat...提示,本质原因是你的CSV文件同时使用逗号(,)和斜杠(/)作为字段分隔符,但你当前的SAS数据步只指定了DLM = ',',这就导致SAS无法正确拆分字段,数据读入时发生错位,原本应该读入某个字段的内容被塞进了其他类型的字段(比如日期字段),自然就会触发无效数据的报错。
下面是具体的解决步骤和优化后的代码:
1. 同时指定多个分隔符
修改infile语句中的DLM参数,把逗号和斜杠都加入进去,这样SAS会将这两个字符都视为字段分隔符:
infile 'R:/Lipeng_Wang/PATSTAT/Publications.csv' DLM = ',/' DSD missover lrecl = 32767 firstobs = 3 ;
这里的DSD选项很关键,它会自动处理被双引号包裹的字段——如果某个字段内容本身包含逗号或斜杠(比如"New York/USA"),DSD会忽略这些内部的分隔符,避免误拆分字段。
2. 优化日期字段的读入格式
你的报错大概率也和publn_date字段有关:如果字段错位,非日期内容被读到这个字段里,或者原始日期是用斜杠分隔的格式(比如10/05/2023),而你用了YYMMDD10.的informat,就会导致日期解析失败。建议改用ANYDTDTE10.这个通用日期格式,它能自动识别多种常见的日期格式(包括斜杠、横杠分隔的):
input pat_publn_id :29. publn_auth :$29. publn_nr :$29. publn_nr_original :$29. publn_kind :$29. appln_id :29. publn_date :ANYDTDTE10. /* 自动识别多种日期格式 */ publn_lg :$29. publn_first_grant :29. publn_claims :29. ;
3. 先测试小样本数据
为了快速验证修改是否有效,建议先导入前几行数据测试,避免直接处理全量大文件浪费时间。只需在infile语句中加入obs=10即可限制读入前10行:
infile 'R:/Lipeng_Wang/PATSTAT/Publications.csv' DLM = ',/' DSD missover lrecl = 32767 firstobs = 3 obs=10 ;
确认测试结果无误后,再去掉obs=10参数处理全量数据。
完整优化后的代码
data SASDATA.Publications ; infile 'R:/Lipeng_Wang/PATSTAT/Publications.csv' DLM = ',/' DSD missover lrecl = 32767 firstobs = 3 obs=10 ; input pat_publn_id :29. publn_auth :$29. publn_nr :$29. publn_nr_original :$29. publn_kind :$29. appln_id :29. publn_date :ANYDTDTE10. publn_lg :$29. publn_first_grant :29. publn_claims :29. ; format publn_date YYMMDDd10. ; run ;
如果测试后还有报错,可以检查SAS日志里具体是哪个字段出现无效数据,针对性调整该字段的informat(比如如果某个字符字段长度不够,把$29.改成更长的$50.)。
内容的提问来源于stack exchange,提问作者Francis

