Вам необходимо предварительно обработать файл, чтобы устранить проблему.
Если вы добавите кавычки вокруг значений, у вас не будет проблемы.
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