Sas 当存在空值变量时,如何导入一个变量中带有单引号的txt文件和另一个变量中带有单引号的txt文件

Sas 当存在空值变量时,如何导入一个变量中带有单引号的txt文件和另一个变量中带有单引号的txt文件,sas,Sas,这是我上一个问题的后续问题: 在没有一个值可以为null的变量之前,那里的解决方案是完美的 在后一种情况下,我得到: filename sample 'c:\temp\sample.txt'; data _null_; file sample; input; put _infile_; datalines; 001|This variable could be null|PROVA|MILANO|1000 002||'80S WERE GREAT|FORLI'|1100 003||

这是我上一个问题的后续问题:

在没有一个值可以为null的变量之前,那里的解决方案是完美的

在后一种情况下,我得到:

filename sample 'c:\temp\sample.txt';
data _null_;
  file sample;
  input;
  put _infile_;
datalines;
001|This variable could be null|PROVA|MILANO|1000
002||'80S WERE GREAT|FORLI'|1100
003||'80S WERE GREAT|ROMA|1110
;

data want;
data prova;
infile sample dlm='|' lrecl=50 truncover;
format 
    codice  $3.
    could_be_null    $20.    
    nome    $20.    
    luogo   $20.
    importo 4.
    ;
input 
    codice  
    could_be_null
    nome    
    luogo   
    importo 
    ;

putlog _infile_;
run;

proc print;
run;


是否可以直接在SAS中正确加载示例中的文件,而无需手动修改原始.txt?

您需要将
DSD
选项添加到
infle
语句中

DSD(分隔符敏感数据)选项-指定SAS应处理 当使用分隔符时,数据值中的分隔符将作为字符数据 数据值用引号括起来。因此,SAS 不将字符串拆分为多个变量和引号 在存储变量之前删除标记。当DSD选项 当SAS遇到连续分隔符时,软件 将这些分隔符视为缺少的值。您可以更改默认值 带有DELIMTER=选项的DSD选项的分隔符


您需要预处理该文件以修复该问题

如果在值周围添加引号,则不会出现问题

002||"'80S WERE GREAT"|"FORLI'"|1100
如果您知道所有值都不包含分隔符,则在每个分隔符之前添加一个空格

002 | |'80S WERE GREAT |FORLI' |1100
将允许您在不使用DSD选项的情况下阅读它

如果行小于32K字节,则可以在读取数据的同一步骤中完成

data test2 ;
  infile sample dlm='|' truncover ;
  input @;
  _infile_ = tranwrd(_infile_,'|',' |');
  input (var1-var5) (:$40.);
run;

proc print;
run;
结果:

Obs    var1               var2                var3                var4     var5

 1     001     This variable could be null    PROVA              MILANO    1000
 2     002                                    '80S WERE GREAT    FORLI'    1100
 3     003                                    '80S WERE GREAT    ROMA      1110
测试是否存在问题的一种方法是确保每行的字段数正确

filename sample temp;
options parmcards=sample;
parmcards;
001|This variable could be null|PROVA|MILANO|1000
002||'80S WERE GREAT|FORLI'|1100
003||'80S WERE GREAT|ROMA|1110
;

data _null_;
  infile sample dsd end=eof;
  if eof then do;
    call symputx('nfound',nfound);
    putlog / 'Found ' nfound :comma11. 
           'problem lines out of ' _n_ :comma11. 'lines.'
    ;
  end;
  input;
  retain expect nfound;
  words=countw(_infile_,'|','qm');
  if _n_=1 then expect=words;
  else if expect ne words then do;
    nfound+1;
    if nfound <= 10 then do; 
       putlog (_n_ expect words) (=) ;
       list;
    end;
  end;
run;

PS去告诉SAS加强他们的分隔文件处理:

不,对不起,如果添加DSD选项,我得到了我在上一个问题中解释的内容,链接到此问题。试试看…它与示例文件完美配合,但我与实际文件有一些问题。如果我不能解决这个问题,我会在周一再试一次,问一个新问题。至于告诉SAS,你的建议似乎没有取得很大的成功:)我认为SAS很快就会被其他一些更先进的语言所取代,如果它们不变得更灵活的话……另一个尝试的技巧是将所有单引号更改为文件中从未出现的其他字符。然后,您可以循环遍历每个字符变量,并在能够将文件读入数据集后再次更改它们。
_N_=2 expect=5 words=4
RULE:     ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
2         002||'80S WERE GREAT|FORLI'|1100 32
_N_=3 expect=5 words=3
3         003||'80S WERE GREAT|ROMA|1110 30

Found 2 problem lines out of 4 lines.