Как работать с потенциально несуществующими входными файлами (* .txt) - PullRequest
0 голосов
/ 12 февраля 2019

Контекст:

Я читаю (используя DATA STEP infile) множество папок (около 80), в основном содержащих три категории *.txt файлов (4 файла ASCII)обработайте их и затем иногда объединяйте (фактически объединяя, используя DATA STEP set) эти наборы данных в два для каждой папки и затем по всем папкам.Иногда случается, что одна или две категории отсутствуют, и SAS выдает ERROR message ("ERROR: Physical file does not exist"), но все еще продолжается, и кажется, что все еще работает.SAS, кажется, генерирует пустые наборы данных (без obs) и работает с ними.

Вопрос: В любом случае, я хочу избавиться от этих ERRORS и проверить с помощью оператора %IF, существует ли файл - который работает - и в противном случае пропустить шаг данных.Но я получаю новый источник ERRORS, когда пытаюсь объединить эти несуществующие наборы данных, а также сортирую эти наборы данных по переменной, которой также не существует - ERROR.Я думал о том, чтобы проверить, пустой ли набор данных и зависит ли это слияние и т. Д., Но я не уверен, что это лучшая идея.Любые рекомендации?Кроме того, SAS уже занимает много времени для обработки всех данных.Из длительных POV это хорошая идея (проверить наличие файлов и т. Д.)?

Мое решение:

  • перехватывает эти несуществующие файлы с помощью оператора %IF и %fileexist
  • генерирует набор данных(автоматически имеет 1 наблюдение), которое содержит только переменную, которую я сортирую по
  • удалить наблюдение
  • следует DATA STEP set
  • удалить пустые наборы данных

Это немного зависит от того, сколько данных содержат файлы ASCII, но весь этот процесс занимает уже 1,5 минуты, и мне придется добавить еще немного данных.DATA STEP infile такой медленный?

Ответы [ 2 ]

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

Скорее всего, вы захотите сначала получить список файлов, а затем обработать их.Например, вы можете использовать команды операционной системы, чтобы получить список файлов.(или найдите код, который использует функцию SAS dread(), чтобы получить список).

data files ;
   infile "ls &path/*.txt" pipe truncover ;
   input filename $256.;
run;

Затем вы можете использовать список файлов для выполнения ваших дальнейших действий.Поэтому, возможно, с помощью опции FILEVAR = в операторе INFILE.

 data want;
    set files ;
    fname=filename;
    infile txt filevar=fname end=eof dsd truncover ;
    do while (not eof);
       input .... ;
       output;
    end;
 run;
0 голосов
/ 12 февраля 2019

Вы можете использовать функцию макроса% sysfunc (fileexist ()).Попробуйте следующий код.При передаче аргумента FILE убедитесь, что он содержит полный путь.

%macro check(file);
  %if %sysfunc(fileexist(&file)) %then %do;
    %put File &file exists.;

    %* YOUR CODE HERE *;

  %end;
  %else
    %put The external file &file does not exist.;
%mend;

например,

%check(/user/lukas/util/test.csv);

...