Импорт таблицы с неизвестной длиной из Excel .xlsm

Я хочу перенести таблицу из Excel в SAS (версия 9.2 и формат файла Excel.XLSM, макрос). Имена столбцов будут считаны из ячейки B3, а данные начнутся с ячейки B4, как показано ниже:

  A   B   C   D   E   F   G ...
1
2
3   Col1 Col2 
4    15   20
5    16   21
6    ... ...

Проблема в том, что номер последней строки неизвестен, потому что длина таблицы сегодня может быть 200 строк, а завтра - 350 строк.

Так как же импортировать эту таблицу из Excel (.XLSM) в SAS-таблицу?

Я где-то читал, что мы можем использовать DATAROW в Proc Import когда DBMS=EXCEL как ниже:

proc import datafile = "!datafile" out=Table1 DBMS = EXCEL REPLACE; 
    SHEET = "Sheet1"; GETNAMES=YES; MIXED=YES; USEDATE=YES; SCANTIME=YES; NAMEROW=3; DATAROW=4;
run;

Однако SAS не может распознать DATAROW вариант, дающий ошибку:

ОШИБКА 180-322: оператор недействителен или используется не по порядку.

Существует еще один способ импорта таблицы из Excel, например:

PROC SQL;
  CONNECT TO EXCEL            (PATH='C:\\thepath\excelfile.xlsm');
  Create Table Table1 as SELECT * FROM CONNECTION TO EXCEL 
  (SELECT * FROM [Sheet1$]);
  DISCONNECT FROM EXCEL;
QUIT;

Кто-нибудь знает, как экспортировать таблицу с неизвестным количеством строк из.XLSM в SAS?

2 ответа

Решение

Я нашел "неэффективное" альтернативное решение, которое считывает все возможные строки в Excel (читает 50 000 строк), в то же время проверяет каждую строку под столбцом. Col1 если эти строки имеют значение.

Это занимает 7-8 секунд, и это работает. Но, как я уже писал, чтение 50 000 строк кажется неэффективным. У кого-нибудь есть идея получше?

PROC SQL;
   CONNECT TO EXCEL            (PATH='C:\\thepath\excelfile.xlsm');
   Create Table Table1 as SELECT * FROM CONNECTION TO EXCEL 
   (SELECT * FROM [Sheet1$B3:C50000] WHERE Col1 IS NOT NULL);
   DISCONNECT FROM EXCEL;
QUIT;

Вы можете использовать прямое соединение с Excel, используя libname заявление:

libname xlsFile Excel 'C:\\thepath\excelfile.xlsm';

data want;
    set xlsFile.'Sheet1$'n(firstobs=3);
    where NOT missing(Col1);
run;

Предполагается, что на сервере SAS установлен Excel и вы приобрели файлы SAS/ACCESS to PC Files.

Другие вопросы по тегам