Нет необходимости использовать 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;
Вы даже можете сделать этот шаг данных достаточно умным, чтобы подсчитать количество полей в первой строке ииспользуйте это для управления циклом, чтобы вам не пришлось жестко его кодировать.