Как импортировать текстовый файл с одинарной кавычкой в ​​переменной и другой в другой переменной, когда есть также переменные с нулевыми значениями - PullRequest
0 голосов
/ 17 апреля 2020

Это продолжение моего предыдущего вопроса: Как импортировать текстовый файл с одинарной кавычкой в ​​переменной и другим в другой переменной .

Решение там работает отлично пока не будет переменной, значения которой могут быть нулевыми.

В этом последнем случае я получаю:

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;

enter image description here

Можно ли правильно загрузить файл, подобный приведенному в примере, непосредственно в SAS, не изменяя вручную исходный файл .txt?

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Вам необходимо предварительно обработать файл, чтобы устранить проблему.

Если вы добавите кавычки вокруг значений, у вас не будет проблемы.

002||"'80S WERE GREAT"|"FORLI'"|1100

IF Вы не знаете , что ни одно из значений не содержит разделитель, а затем добавляется пробел перед каждым разделителем

002 | |'80S WERE GREAT |FORLI' |1100

Вы читаете его без опции DSD.

Если строки короче 32 Кбайт, то это можно сделать на том же шаге, что и данные.

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;

Пример результатов:

_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.

PS Go говорит SAS улучшить обработку файлов с разделителями: https://communities.sas.com/t5/SASware-Ballot-Ideas/Enhancements-to-INFILE-FILE-to-handle-delimited-file-variations/idi-p/435977

0 голосов
/ 17 апреля 2020

Вам необходимо добавить опцию DSD в ваш оператор INFILE.

https://support.sas.com/techsup/technote/ts673.pdf

DSD (разделитель- конфиденциальные данные) параметр - указывает, что SAS должен обрабатывать разделители в значении данных как символьные данные, когда разделители и значение данных заключаются в кавычки. В результате SAS не разбивает строку на несколько переменных, и кавычки удаляются перед сохранением переменной. Если указан параметр DSD и SAS обнаруживает последовательные разделители, программное обеспечение обрабатывает эти разделители как пропущенные значения. Вы можете изменить разделитель по умолчанию для опции DSD с помощью опции DELIMTER =.

...