如果csv文件同时包含分隔符/和,

如果csv文件同时包含分隔符/和,,csv,sas,Csv,Sas,我有一个混合分隔符、和/的文件。当我使用以下数据步骤将其导入SAS时: data SASDATA.Publications ; infile 'R:/Lipeng_Wang/PATSTAT/Publications.csv' DLM = ',' DSD missover lrecl = 32767 firstobs = 3 ; input pat_publn_id :29. publn_auth :$29.

我有一个混合分隔符
/
的文件。当我使用以下数据步骤将其导入SAS时:

data SASDATA.Publications ;
    infile 'R:/Lipeng_Wang/PATSTAT/Publications.csv' 
        DLM = ',' 
        DSD missover lrecl = 32767 
        firstobs = 3 ;
    input pat_publn_id :29. 
        publn_auth :$29. 
        publn_nr :$29. 
        publn_nr_original :$29. 
        publn_kind :$29. 
        appln_id :29. 
        publn_date :YYMMDD10. 
        publn_lg :$29. 
        publn_first_grant :29. 
        publn_claims :29. ;
    format publn_date :YYMMDDd10. ;
run ;
sas日志显示

NOTE: Invalid data for appln_id in line 68262946 33-34.
NOTE: Invalid data for publn_date in line 68262946 36-44.
RULE:     ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9
 68262946  390735978,HK,1053433,09/465,054,A1,275562685,2010-03-26,  ,0,0 62
 pat_publn_id=390735978 publn_auth=HK publn_nr=1053433 publn_nr_original=09/465 publn_kind=054
 appln_id=. publn_date=. publn_lg=2010-03-26 publn_first_grant=. publn_claims=0 _ERROR_=1
 _N_=68262944
NOTE: Invalid data for appln_id in line 68280355 33-34.
NOTE: Invalid data for publn_date in line 68280355 36-44.
 68280355  390753387,HK,1092990,60/523,466,A1,275562719,2010-03-26,  ,0,0 62
 pat_publn_id=390753387 publn_auth=HK publn_nr=1092990 publn_nr_original=60/523 publn_kind=466
 appln_id=. publn_date=. publn_lg=2010-03-26 publn_first_grant=. publn_claims=0 _ERROR_=1
 _N_=68280353

似乎我需要将“60/523466”归档到“publn_nr_original”卷中。但是我该怎么做呢?

好的,我明白你的意思了——在一个逗号分隔的文件中,有一个带逗号的字段,而该字段没有被引用

为此,您必须分别阅读中的两个部分,并添加逗号,如下面的示例代码所示

值得注意的是,您的所有值都必须有逗号才能使此方法起作用!这实际上看起来像是坏数据,如果您的输入字段确实是“60/523466”,那么它应该在您的输入文件中被“引用”以正确读取

%let some_csv=%sysfunc(pathname(work))/some.csv;
data _null_;
  file "&some_csv";
  put /;
  put '390735978,HK,1053433,09/465,054,A1,275562685,2010-03-26,  ,0,0';
  put '390753387,HK,1092990,60/523,466,A1,275562719,2010-03-26,  ,0,0';
run;


data work.Publications ;
  infile "&some_csv" DLM = ',' DSD missover lrecl = 32767 firstobs = 3 ;
  input pat_publn_id :best. publn_auth :$29. publn_nr :$29. 
    publn_nr_original1 :$29. publn_nr_original2:$29. 
    publn_kind :$29. appln_id :best. 
    publn_date :YYMMDD10. publn_lg :$29. publn_first_grant :best. 
    publn_claims :best. ;
  format publn_date YYMMDDd10. ;
  publn_nr_original=cats(publn_nr_original1,',',publn_nr_original2);
run ;

您的程序代码有两个明显的问题

首先,FORMAT语句的语法是错误的。
修饰符是
输入
输入
语句语法的一项功能,不应在
格式
语句中使用

第二,你试图把29位数字读入一个数字。您无法在SAS中将29位数字准确地存储到一个数字中。如果这些值确实超过15位,则需要将它们读入字符变量。如果它们确实是较小的数字(可以存储为数字),则不需要在
INPUT
语句中包含informat规范。SAS已经知道如何从文本文件中读取数字。在列表模式下,输入语句将忽略信息的宽度

但您的错误消息似乎是由格式不正确的文件引起的。我怀疑前6列中有一列的值中有一个逗号,但是创建数据文件的人忘记了在值周围添加逗号引号。如果您能够找出逗号应该在哪个字段中,那么您可能能够以一种可以使用的方式解析该行

这里有一种方法,假设逗号只出现在
publn\u nr\u original
变量中,并且最多会出现一个逗号

data want ; 
 infile cards dsd truncover firstobs=3;
 length
 pat_publn_id $30
 publn_auth $30
 publn_nr $30
 publn_nr_original $30
 publn_kind $30
 appln_id $30
 publn_date 8
 publn_lg $30
 publn_first_grant $30
 publn_claims $30
;
 informat publn_date YYMMDD10. ;
 format publn_date YYMMDDd10. ;
 input @;
 if countw(_infile_,',','mq')<= 10 then input pat_publn_id -- publn_claims ;
 else do ;
   list ;
   input pat_publn_id -- publn_nr_original xxx :$30. publn_kind -- publn_claims ;
   publn_nr_original=catx(',',publn_nr_original,xxx);
   drop xxx;
 end;
cards4;
Header1
Header2
1,22,333,4444,55,6666,2010-03-26,77,8,9999
390735978,HK,1053433,09/465,054,A1,275562685,2010-03-26,  ,0,0
390735978,HK,1053433,"09/465,054",A1,275562685,2010-03-26,  ,0,0
390753387,HK,1092990,60/523,466,A1,275562719,2010-03-26,  ,0,0
;;;;
这条线应该是这样的:

390735978,HK,1053433,"09/465,054",A1,275562685,2010-03-26,  ,0,0

谢谢你的回答,但我确认A1是属于publn_类的变量,。此外,appln_id是一个数字,根据数据目录显示,appln_id的域编号为0…999。因此,似乎我需要将“60/523466”归档到“publn_nr_original”卷中。但是我该怎么做呢?我更新了(再次制作了
appln\u id
numeric)。上述方法将A1放入
publn\u kind
,并将变量的两部分放入
publn\u nr\u original
。感谢您的回答,但“09/465054”分为两部分,它们分别是“60/523”和“466”,分别放在“publn_nr_original1”卷和“publn_nr_original2”卷中。文档对该特定字段说明了什么?一个建立良好的数据库不太可能出现这种问题,所以我想知道这里是否还有其他问题。重新格式化代码,更好地介绍代码。(但很抱歉,我仍然不理解目标)针对此类问题的首选解决方案是要求您的数据供应商提供格式一致的数据。只有在不可能的情况下,才继续重复其他人造成的问题。请提供示例数据,并告诉我们是否所有数据行都出现问题
390735978,HK,1053433,"09/465,054",A1,275562685,2010-03-26,  ,0,0