INFILE останавливает шаг данных всякий раз, когда нет соответствующих входных данных, прочитанных из внешнего файла - PullRequest
0 голосов
/ 15 февраля 2019

Мой шаг данных останавливается, когда моя команда INFILE не возвращает совпадающее значение из внешнего источника файла.Почему это так?

У меня есть набор данных work._input со следующими значениями:

fname
cus_01.txt
cus_02.txt
cus_03.txt

Вот значения каждого внешнего текстового файла:

cus_01.txt:

ID: 0001
Firstname: John
Lastname: White

cus_02.txt:

This is just a dummy/empty dataset

cus_03.txt:

ID: 0002
Firstname: Mike
Lastname: Harrel

Код:

%let sPath = /root/documents/files;

data work._output;

    set work._input;
    length firstname lastname path f2r $512. fname $32.;

    path = symget('sPath');
    f2r = catx("/", path, fname);

    infile a filevar=f2r;

    input @'Firstname:' firstname $;
    input @'Lastname:' lastname $;

    output work._output;

run;

ВЫХОД:

На первой итерации шага данных это будет значение:

Firstname    Lastname    fname
John         White       cus_01.txt

Однако на второй итерации шага данных в cus_02 не будет найдено соответствующих «Имя» и «Фамилия».TXT-файл, и это приведет к тому, что шаг данных прекратит обработку, следовательно, третья итерация для не будет выполнена, и cus_03.txt не будет прочитан.

Могу я знать, почему?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Я уже нашел решение.

Я добавил внутренний цикл для обработки всех наблюдений внешнего файла и использовал сопоставление имен вместо @ 'символьной строки'

S / OТому из SAS Communities за предложения!

%let sPath = /root/documents/files;

data work._output;

set work._input;
length firstname lastname path f2r $512. fname $32.;

path = symget('sPath');
f2r = catx("/", path, fname);

infile a filevar=f2r dlm=":" end=eof truncover;

do while(not eof);
   input Label $ value $;
   if Label =: 'Firstname' then firstname = value;
   if Label =: 'Lastname' then lastname = value;
end;

run;

0 голосов
/ 15 февраля 2019

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

(не проверено)

data work._output;

  set work._input;
  length firstname lastname path f2r $512. fname $32.;

  path = symget('sPath');
  f2r = catx("/", path, fname);

  file_end = 0; * reset just in case;
  infile a filevar=f2r end=file_end;

  do while (not file_end);

    input @'Firstname:' firstname $;
    input @'Lastname:' lastname $;

    output work._output;

  end;
run;

Без внутреннегоцикл, после каждого ввода filevar продвигается к следующему имени файла, предоставленному set _input.

Примечание: это работает иначе, чем INFILE "<wildcarded filename specification>", который не нуждается во внутреннем цикле.

Кроме того, вывозникнет проблема, когда пары линий Firstname: и Lastname: не синхронизируются (например, когда отсутствует одна из двух или имеется дополнительная строка данных (например, MiddleInitial:))

...