SAS Export Issue как дополнительная двойная кавычка - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь экспортировать данные SAS в CSV, имя набора данных sas здесь abc, а формат:

ОПИСАНИЕ LINE_NUMBER
524JG 24PC НАБОР AMEFA VINTAGE CUTLERY "DUBARRY"

Яиспользуя следующий код.

filename exprt "C:/abc.csv" encoding="utf-8";

proc export data=abc
outfile=exprt
dbms=tab;
run;

вывод

LINE_NUMBER ОПИСАНИЕ
524JG "НАБОР НА ВЫХОДЕ AMEFA 24PC" "DUBARRY" ""

, поэтому двойная кавычкадоступно до и после описания здесь, а после и до слова DUBARRY появится дополнительная цитата.Я понятия не имею, что происходит.Может ли кто-нибудь помочь мне решить эту проблему и заставить меня понять, что именно происходит здесь.

ожидаемый результат:

ОПИСАНИЕ LINE_NUMBER
524JG 24PC КОМПЛЕКТ CUTLERY AMEFA VINTAGE "DUBARRY"

1 Ответ

0 голосов
/ 20 декабря 2018

Нет необходимости использовать PROC EXPORT для создания файла с разделителями.Вы можете написать это с простым шагом DATA.Если вы хотите создать файл примера, просто не используйте параметр DSD в операторе FILE.Но обратите внимание, что в зависимости от данных, которые вы пишете, вы можете создать файл, который не может быть проанализирован должным образом из-за дополнительных незащищенных разделителей.Также у вас будут проблемы с представлением пропущенных значений.

Давайте создадим образец набора данных, который мы можем использовать для тестирования.

data have ;
  input id value cvalue $ name $20. ;
cards;
1 123 A Normal
2 345 B Embedded|delimiter
3 678 C Embedded "quotes"
4 .   D Missing value
5 901 . Missing cvalue
;

По сути, PROC EXPORT записывает данные с использованием опции DSD.Например:

data _null_;
  set have ;
  file 'myfile.txt' dsd dlm='09'x ;
  put (_all_) (+0);
run;

, что приведет к созданию файла, подобного этому (с трубками, заменяющими вкладки, чтобы вы могли их видеть).

1|123|A|Normal
2|345|B|"Embedded|delimiter"
3|678|C|"Embedded ""quotes"""
4||D|Missing value
5|901||Missing cvalue

Если вы просто удалите опцию DSD, товместо этого вы получаете файл, подобный этому.

1|123|A|Normal
2|345|B|Embedded|delimiter
3|678|C|Embedded "quotes"
4|.|D|Missing value
5|901| |Missing cvalue

Обратите внимание, что вторая строка выглядит так, как будто она имеет 5 значений вместо 4, что делает невозможным знать, как разбить его на 4 значения.Также обратите внимание, что пропущенные значения имеют минимальную длину не менее одного символа.

Другим способом было бы выполнить шаг данных для преобразования обычного файла, который PROC EXPORT генерирует, в нужный формат варианта.Это также может дать вам место для добавления escape-символов для защиты специальных символов, если они требуются вашему целевому формату.

data _null_;
  infile normal dsd dlm='|' truncover ;
  file abnormal dlm='|';
  do i=1 to 4 ;
    if i>1 then put '|' @;
    input field :$32767. @;
    field = tranwrd(field,'\','\\');
    field = tranwrd(field,'|','\|');
    len = lengthn(field);
    put field $varying32767. len @;
  end;
  put;
run;

Вы даже можете сделать этот шаг данных достаточно умным, чтобы подсчитать количество полей в первой строке ииспользуйте это для управления циклом, чтобы вам не пришлось жестко его кодировать.

...