2014-08-27 18 views
5

Tôi chỉ đang cố nối hai biến macro được trích dẫn nhưng dường như không có cách nào dễ dàng.Ghép các biến macro được trích dẫn

Giả sử chúng ta có:

%LET VAR1="This is not the greatest song in the world"; 
%LET VAR2="this is just a tribute."; 

%LET TRIBUTE=%SYSFUNC(CATX(%STR(),&VAR1,&VAR2)); 
%PUT &TRIBUTE; 

Tôi thực sự muốn:

"This is not the greatest song in the world this is just a tribute." 

Nhưng đoạn mã trên thực sự mang lại:

"This is not the greatest song in the world" "this is just a tribute." 

Vì vậy, tôi thử đặt %QUOTE(), %BQUOTE, vv. xung quanh &VAR1%VAR2 với hy vọng sẽ vạch mặt dấu ngoặc kép nhưng tôi nhận được kết quả tương tự.

Điều duy nhất làm việc cho tôi là:

%LET TRIBUTE="%SUBSTR(&VAR1.,2,%LENGTH(&VAR1.)-2) %SUBSTR(&VAR2.,2,%LENGTH(&VAR2.)-2)"; 

Nhưng điều này là xấu xí và có thể nhận được dài rất nhanh. Có cách nào tốt hơn không?

Trả lời

2

Bạn có thể sử dụng COMPRESS để thực hiện việc này.

%LET VAR1="This is not the greatest song in the world"; 
%LET VAR2="this is just a tribute."; 


%let VAR3=%sysfunc(compress(&VAR1,%str(%"))); 
%put &=var1 &=var3; 

Hơi khó để xóa dấu ngoặc kép, nhưng nó hoạt động.

Bạn cũng có thể thực hiện việc này trong chức năng FCMP hoặc macro kiểu hàm; đây là một ví dụ.

%macro unquote_string(string=); 
%sysfunc(compress(&string.,%str(%'%"))) 
%mend unquote_string; 

%let VAR3="%unquote_string(string=&var1.) %unquote_string(string=&var2.)"; 
%put &=var3.; 

Lưu ý bạn không nên sử dụng chức năng CAT để nối các biến macro. Chúng chỉ là văn bản, vì vậy hãy gõ văn bản sau khi người kia tự động ghép chúng lại.

Tuy nhiên, câu trả lời thực sự cho câu hỏi của bạn về 'Có cách nào tốt hơn', không lưu trữ các trích dẫn trong biến macro. Hầu hết thời gian bạn nên lưu trữ các biến vĩ mô w/o báo giá và sử dụng nó trong dấu ngoặc kép khi cần thiết. SAS Macros không tôn trọng các dấu ngoặc kép như bất cứ điều gì đặc biệt - chúng chỉ là một ký tự trong một chuỗi - vì vậy chúng không có một công cụ cụ thể để xử lý việc này.

+0

Hai điều ... trước tiên - tôi không biết về cú pháp '& =' - cảm ơn! Thứ hai, bạn có thể đơn giản hóa việc gán var3 của bạn thành '% let VAR3 ="% unquote_string (string = & var1 & var2.) ";'. –

+0

Bạn hoàn toàn có thể đơn giản hóa nó theo cách đó. Tôi thích ở trên một chút, mặc dù, vì nó rõ ràng hơn những gì bạn đang loại bỏ dấu ngoặc kép từ - loại song song với cách '% UNQUOTE' hoạt động như xa như trích dẫn vĩ mô. (Tôi nghĩ rằng bạn sẽ phải gọi nó hai lần nếu đây là những mvars được trích dẫn bằng macro). – Joe

+0

Thực ra, bây giờ tôi nghĩ về nó, đây là một ví dụ tồi khi tạo hàm FCMP hoặc hàm macro, vì bạn chỉ đơn giản là gói các cuộc gọi đến một hàm hiện có .... cũng có thể chỉ gọi hàm trực tiếp . –

4

Tôi sẽ diễn giải câu trả lời thực sự của Joe - không lưu trữ các trích dẫn trong biến macro. Dấu nháy đơn và kép trong ngôn ngữ macro không khác với bất kỳ ký tự nào khác. Những gì bạn nên làm là trì hoãn giới thiệu các dấu ngoặc kép cho đến khi bạn thực sự cần chúng. Điều này sẽ cho kết quả sạch hơn, linh hoạt hơn, dễ đọc hơn và mã không có lỗi.

Code:

Thông báo Tôi đã gỡ bỏ các dấu ngoặc kép và nối các chuỗi Tôi chỉ liệt kê chúng một sau khi khác:

%LET VAR1=This is not the greatest song in the world; 
%LET VAR2=this is just a tribute.; 
%LET TRIBUTE=&VAR1 &VAR2; 

Ví dụ 1

Không cần trích dẫn để in ra chuỗi mong muốn khi chúng tôi đang sử dụng câu lệnh %put trong ví dụ đầu tiên này - vì lý do này tôi đã để lại dấu ngoặc kép:

%PUT &TRIBUTE; 

Output:

This is not the greatest song in the world this is just a tribute. 

Ví dụ 2

Quotes được yêu cầu bởi vì bây giờ chúng ta đang ở đất dữ liệu bước:

data _null_; 
    put "&TRIBUTE"; 
run; 

Output:

This is not the greatest song in the world this is just a tribute. 

Lưu ý rằng cả hai ví dụ này đều cho rằng bạn thực sự không muốn in dấu ngoặc kép trên màn hình.

+0

Thông thường tôi sẽ tránh báo giá trong các biến vĩ mô như bạn nói.Tuy nhiên, tôi có một vài macro sử dụng chung req tham số uiring có thể có hoặc không chứa dấu phẩy. Điều này có thể gây ra lỗi tham số vị trí nếu không được trích dẫn, do đó, như một quy tắc, bất cứ khi nào tôi viết các macro này, tôi yêu cầu tham số được trích dẫn, chỉ để an toàn. Nhưng sau đó tôi có thể muốn nối vào phần thân của macro hoặc cái gì đó và đây là nơi mà câu hỏi của tôi xuất hiện. – Pane

+1

Cách chính xác để xử lý dấu phẩy để tránh vấn đề bạn mô tả là bọc các giá trị bằng hàm macro '% bquote()'. –

+0

@Pane Thật vậy, các ký tự trích dẫn không nên được sử dụng cho mục đích này. – Joe

Các vấn đề liên quan