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

У меня есть файл prova.txt, который содержит:

001|PROVA|MILANO|1000
002|'80S WERE GREAT|FORLI'|1100
003|'80S WERE GREAT|ROMA|1110

Я импортирую его как набор данных SAS с этим кодом:

libname mylib "/my/lib"; 

data prova;
infile '/my/lib/prova.txt' 
    dlm='|' dsd lrecl=50 truncover;
format 
    codice  $3.
    nome    $20.    
    luogo   $20.
    importo 4.
    ;
input 
    codice  :$3.
    nome    :$20.
    luogo   :$20.       
    importo :4.
    ;
run;

И я получаю этот результат :

enter image description here

Как видите, первая и третья записи хорошо импортируются, тогда как вторая имеет nome = 80S WERE GREAT|FORLI и остальные переменные - беспорядок.

Как правильно импортировать этот файл?

PS = одинарные кавычки в файле верны. FORLI' - это название города в Италии, и существует фирма, название которой начинается с '80. Конечно, это не настоящие имена, но реальный случай именно такой. Мне нужно импортировать переменные с кавычками в их содержании.

Ответы [ 2 ]

2 голосов
/ 19 февраля 2020

DSD и DLM приводят к тому, что встроенный разделитель (') в одинарных кавычках (|) является частью значения данных.

Удалите параметры DSD и разделитель не будет считаться «вложенным значением» и, таким образом, станет разделителем значений для примера 002|'80S WERE GREAT|FORLI'|1100

. Оператор формата неявно определяет тип и длину значения переменной, если он содержит первое упоминание переменной в шаг. Из-за этого вы можете упростить оператор input, чтобы он представлял собой просто список переменных:

filename sample 'c:\temp\sample.txt';
data _null_;
  file sample;
  input;
  put _infile_;
datalines;
001|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.
    nome    $20.    
    luogo   $20.
    importo 4.
    ;
input 
    codice  
    nome    
    luogo   
    importo 
    ;

putlog _infile_;
run;

proc print;
run;

enter image description here

0 голосов
/ 19 февраля 2020

Установив qoute, вы создаете строку, и импорт не сможет правильно разделить переменные.

ваш файл должен выглядеть примерно так:

001|'PROVA'|MILANO|1000
002|'80S WERE GREAT'|FORLI|1100
003|'80S WERE GREAT'|ROMA|1110
...