1 Câu hỏi: CALL SYMPUT một toán hạng ký tự được tìm thấy trong hàm% EVAL

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tôi hiện đang cố gắng tạo một macro đang đặt các phần của chuỗi thành danh sách các biến toàn cục trong đó các phần của chuỗi được phân tách bằng "-", ví dụ: 672-46-246 sẽ tạo ba biến toàn cục , name2, name2 và name4, được gọi lần lượt là 672, 46, 246. Ngoài ra còn có một tên1 là biến toàn cục của toàn bộ chuỗi. Nhưng dù sao tôi cũng có khả năng đưa toàn bộ chuỗi thành một biến toàn cục nhưng tôi gặp khó khăn khi tách nó ra. Có thể có những cách khác để làm điều này nhưng những gì tôi đang cố gắng thực hiện là thực hiện một vòng lặp để có bao nhiêu "phân tách", tức là "-" và sau đó đặt nền tảng cho nó bằng các phân tách đó. Ngay bây giờ tôi đang cố gắng tìm hiểu có bao nhiêu "chia tách" nhưng mã đang quay trở lại

LRI: Đã tìm thấy toán hạng ký tự trong hàm% EVAL hoặc điều kiện% IF khi yêu cầu toán hạng số. Điều kiện là:        & chia nhỏ.

Không chắc chắn những gì khác để bao gồm ở đây trong bản tóm tắt.

Mã bên dưới

%GLOBAL C;
%LET C=1;
DATA _NULL_;
    SET T_&scope.;
    %DO I = 1 %TO &sqlobs.;
        %GLOBAL name&C.;
        CALL SYMPUT("name&C.", COL&I.);
        %Counter(C);
        CALL SYMPUT("splits", COUNTC(COL&I., "-"));
        %DO J = 0 %TO &splits.;
            %Counter(C);
        %END;
    %END;
RUN;

CẢNH BÁO: SPLITS tham chiếu tượng trưng rõ ràng không được giải quyết. LRI: Đã tìm thấy một toán hạng ký tự trong hàm% EVAL hoặc% IF trong đó yêu cầu một toán hạng số. Điều kiện là:        & chia nhỏ.

    
0
  1. Vui lòng hiển thị rõ ràng đầu vào của bạn là gì và bạn muốn làm đầu ra. Nó thực sự không rõ ràng những gì bạn đang cố gắng làm. Nếu bạn đang bắt đầu với các biến macro, hãy hiển thị% LET để gán các giá trị ban đầu. Nếu đầu ra của bạn là các biến vĩ mô thì hiển thị% LET báo cáo thể hiện đầu ra dự kiến ​​cho đầu vào đã cho. Nếu đầu vào hoặc đầu ra là một tập dữ liệu thì hiển thị bước dữ liệu tạo ra tập dữ liệu.
    2019-05-08 17: 21: 49Z
  2. Việc đặt danh sách các biến macro thường không hữu ích lắm. Tại sao không chỉ để các giá trị trong biến macro đơn dưới dạng một chuỗi được phân tách và rút ra từng giá trị khi bạn cần?
    2019-05-08 17: 31: 26Z
1 Câu trả lời                              1                         

Không chắc câu hỏi là gì nhưng lý do cho lỗi của bạn là bạn đang cố sử dụng biến macro SPLITS trước khi bạn đưa ra giá trị. Bộ xử lý macro chạy trước và sau đó mã kết quả được biên dịch và chạy bởi SAS. Vì vậy, câu lệnh macro %do j=0 %to &splits; của bạn được đánh giá TRƯỚC KHI bước dữ liệu của bạn bắt đầu chạy và do đó chắc chắn trước khi câu lệnh CALL SYMPUT() có thể chạy.

Nếu bạn có danh sách các giá trị trong biến macro, hãy sử dụng %SCAN() để chọn ra các giá trị riêng lẻ.

%let list= 672-46-246 ;
%do i=1 %to %sysfunc(countw(&list,-));
  %let next=%scan(&list,&i,-);
  ...
%end;
    
2
2019-05-08 17: 34: 05Z
  1. . I., -));, nó nghĩ về col1, col2, col3 là một chuỗi riêng lẻ và không phải là biến mà tôi muốn nó là. Tôi sẽ nghĩ về một cách để giữ nguyên trạng đó và sau đó cập nhật nếu tôi nghĩ ra một cách tốt hơn mà không phải loay hoay với tất cả những điều này.
2019-05-08 17: 47: 39Z
  • Đó là lý do tại sao tôi nói KHÔNG đưa dữ liệu vào một loạt các biến macro. Để sử dụng biến I làm đầu đuôi của TÊN biến macro và lấy GIÁ TRỊ của biến macro, bạn cần thêm & 's. %let i=1; %put Value of col&i is "&&col&i";
    2019-05-08 19: 24: 49Z
  • nguồn đặt đây