diff --git a/base/mf_readfile.sas b/base/mf_readfile.sas
new file mode 100644
index 0000000..fa7fd97
--- /dev/null
+++ b/base/mf_readfile.sas
@@ -0,0 +1,63 @@
+/**
+ @file
+ @brief Reads the first line of a file using pure macro
+ @details Reads the first line of a file and returns it. Future versions may
+ read each line into a macro variable array.
+
+ Generally, reading data into macro variables is not great as certain
+ nonprintable characters (such as CR, LF) may be dropped in the conversion.
+
+ Usage:
+
+ %mf_writefile(&sasjswork/myfile.txt,l1=some content,l2=more content)
+
+ %put %mf_readfile(&sasjswork/myfile.txt);
+
+
+ @param [in] fpath Full path to file to be read
+
+
Related Macros
+ @li mf_deletefile.sas
+ @li mf_writefile.sas
+ @li mf_readfile.test.sas
+
+ @version 9.2
+ @author Allan Bowe
+**/
+/** @cond */
+
+%macro mf_readfile(fpath
+)/*/STORE SOURCE*/;
+%local fref rc fid fcontent;
+
+/* check file exists */
+%if %sysfunc(filename(fref,&fpath)) ne 0 %then %do;
+ %put &=fref &=fpath;
+ %put %str(ERR)OR: %sysfunc(sysmsg());
+ %return;
+%end;
+
+%let fid=%sysfunc(fopen(&fref,I));
+
+%if &fid=0 %then %do;
+ %put %str(ERR)OR: %sysfunc(sysmsg());
+ %return;
+%end;
+
+%if %sysfunc(fread(&fid)) = 0 %then %do;
+ %let rc=%sysfunc(fget(&fid,fcontent,65534));
+ &fcontent
+%end;
+
+/*
+%do %while(%sysfunc(fread(&fid)) = 0);
+ %let rc=%sysfunc(fget(&fid,fcontent,65534));
+ &fcontent
+%end;
+*/
+
+%let rc=%sysfunc(fclose(&fid));
+%let rc=%sysfunc(filename(&fref));
+
+%mend mf_readfile;
+/** @endcond */
diff --git a/tests/base/mf_readfile.test.sas b/tests/base/mf_readfile.test.sas
new file mode 100644
index 0000000..92bc354
--- /dev/null
+++ b/tests/base/mf_readfile.test.sas
@@ -0,0 +1,29 @@
+/**
+ @file
+ @brief Testing mf_readfile.sas macro
+
+ SAS Macros
+ @li mf_readfile.sas
+ @li mp_assert.sas
+
+**/
+
+%let f=&sasjswork/myfile.txt;
+
+%mf_writefile(&f,l1=some content,l2=more content)
+data _null_;
+ infile "&f";
+ input;
+ putlog _infile_;
+run;
+
+%mp_assert(
+ iftrue=(&syscc=0),
+ desc=Check code ran without errors,
+ outds=work.test_results
+)
+%mp_assert(
+ iftrue=(&f=some content),
+ desc=Checking first line was ingested successfully,
+ outds=work.test_results
+)