Automatically specify line break options with termstr as CRLF or LF in SAS when importing data


Vinh Nguyen


October 9, 2015

It could be annoying when dealing with data from multiple platforms: Windows uses the carriage return (CR) and line feed (LF) to indicate a new line, UNIX uses LF, and Mac uses CR. Most companies have SAS running on a UNIX/Linux server, and it's hard to tell which characters indicate a new line without going to a terminal to inspect the file.

Here's a sas macro that creates a filename handle that could be used in PROC IMPORT or a DATA step. It will automatically detect CRLF and if not, default to LF. This assumes SAS is running on a UNIX server with access to the head and awk commands.

{sas eval=FALSE} %macro handle_crlf(file, handle_name, other_filename_options=) ; /* if there is a carriage return at the end, then return 1 (stored in macro variable SYSRC) */ %sysexec head -n 1 "&file" | awk '/\r$/ { exit(1) }' ; %if &SYSRC=1 %then %let termstr=crlf ; %else %let termstr=lf ; filename &handle_name "&file" termstr=&termstr &other_filename_options ; %mend ; /* %handle_crlf(file=/path/to/file.txt, handle_name=fh) ; proc import data=fh dbms=dlm replace outdata=d1 ; delimiter='|' ; run ; */