Automatically specify line break options with termstr as CRLF or LF in SAS when importing data
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 ; */