BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
js5
Pyrite | Level 9 js5
Pyrite | Level 9

Dear community,

 

I am trying to adapt the date conversion function [1] to use regular expressions:

proc fcmp outlib=work.functions.conversions; /*[1]*/
	function datecdash2sdtm(indate $) $; /*[2]*/
		length outdate $10; /*[3]*/
		cdash_date_regex = prxparse("/(UN|\d{1,2}) (\w{3}) (\d{4})/");

/*		if indate ne ' ' then*/
		if prxmatch(cdash_date_regex, indate) then
			do;
				yyyy = prxposn(cdash_date_regex, 3, indate);
				mmm = prxposn(cdash_date_regex, 2, indate);
				dd = prxposn(cdash_date_regex, 1, indate);
				/*yyyy = substr(indate, 8, 4); *//*[4]*/
/*				mmm = upcase(substr(indate, 4, 3));*/
/*				dd = substr(indate, 1, 2);*/

				/* if year not missing */
				if notdigit(yyyy) = 0 then
					do;
						/*[5]*/
						mm = put(mmm, $month.); /*[6]*/

						/* if month not missing */
						if mm ne ' ' then
							do;
								/* if day not missing */
								if notdigit(dd) = 0 then
									do;
										/*[5]*/
										outdate = yyyy || '-' || strip(mm) || '-' || dd; /*[7]*/
									end; /* if notdigit(dd) = 0 */
								else outdate = yyyy || '-' || strip(mm);
							end; /* if mm ne ' ' */
						else outdate = yyyy;
					end; /* if notdigit(yyyy) = 0 */
				else outdate = ' ';
			end; /* if indate ne ' ' */
		else outdate = ' ';
		return(outdate); /*[8]*/
	endsub; /*[9]*/
run;

Unfortunately the function is not working and produces empty output. If I try to just parse the dates in plain data step

data mh_crf;
	set ecrf.mh1b ecrf.mh1a;
	MHSTDTC = datecdash2sdtm(MHTRSTDAT);
	MHENDTC = datecdash2sdtm(MHTRENDAT);
	cdash_date_regex = prxparse("/(UN|\d{1,2}) (\w{3}) (\d{4})/");

	if prxmatch(cdash_date_regex, MHTRENDAT) then
		do;
			yyyy = prxposn(cdash_date_regex, 3, MHTRENDAT);
			mmm = prxposn(cdash_date_regex, 2, MHTRENDAT);
			dd = prxposn(cdash_date_regex, 1, MHTRENDAT);
		end;
run;

then yyyy, mmm and dd variables are populated as expected. Are there any particular things one needs to keep in mind when mixing proc fcmp with regular expressions? Thank you!

 

[1] https://www.lexjansen.com/pharmasug/2017/TT/PharmaSUG-2017-TT07.pdf

1 ACCEPTED SOLUTION

Accepted Solutions
js5
Pyrite | Level 9 js5
Pyrite | Level 9

It turns out that spaces were causing notdigit conditions to no longer be satisfied. Here is the working code:

proc fcmp outlib=work.functions.conversions; /*[1]*/
	function datecdash2sdtm(indate $) $; /*[2]*/
		length outdate $10; /*[3]*/
		cdash_date_regex = prxparse("/(UN|\d{1,2}) (\w{3}) (\d{4})/");

		if prxmatch(cdash_date_regex, indate) then
			do;
				yyyy = prxposn(cdash_date_regex, 3, indate); /*[4]*/
				mmm = prxposn(cdash_date_regex, 2, indate);
				dd = prxposn(cdash_date_regex, 1, indate);

				/* if year not missing */
				if notdigit(strip(yyyy)) = 0 then
					do;
						/*[5]*/
						mm = put(mmm, $month.); /*[6]*/

						/* if month not missing */
						if mm ne ' ' then
							do;
								/* if day not missing */
								if notdigit(strip(dd)) = 0 then
									do;
										dd = put(input(dd, 2.), z2.);
										/*[5]*/
										outdate = catx("-", yyyy, mm, dd); /*[7]*/
									end; /* if notdigit(dd) = 0 */
								else outdate = catx("-", yyyy, mm);
							end; /* if mm ne ' ' */
						else outdate = strip(yyyy);
					end; /* if notdigit(yyyy) = 0 */
				else outdate = ' ';
			end; /* if indate ne ' ' */
		else outdate = ' ';
		return(outdate); /*[8]*/
	endsub; /*[9]*/
run;

View solution in original post

1 REPLY 1
js5
Pyrite | Level 9 js5
Pyrite | Level 9

It turns out that spaces were causing notdigit conditions to no longer be satisfied. Here is the working code:

proc fcmp outlib=work.functions.conversions; /*[1]*/
	function datecdash2sdtm(indate $) $; /*[2]*/
		length outdate $10; /*[3]*/
		cdash_date_regex = prxparse("/(UN|\d{1,2}) (\w{3}) (\d{4})/");

		if prxmatch(cdash_date_regex, indate) then
			do;
				yyyy = prxposn(cdash_date_regex, 3, indate); /*[4]*/
				mmm = prxposn(cdash_date_regex, 2, indate);
				dd = prxposn(cdash_date_regex, 1, indate);

				/* if year not missing */
				if notdigit(strip(yyyy)) = 0 then
					do;
						/*[5]*/
						mm = put(mmm, $month.); /*[6]*/

						/* if month not missing */
						if mm ne ' ' then
							do;
								/* if day not missing */
								if notdigit(strip(dd)) = 0 then
									do;
										dd = put(input(dd, 2.), z2.);
										/*[5]*/
										outdate = catx("-", yyyy, mm, dd); /*[7]*/
									end; /* if notdigit(dd) = 0 */
								else outdate = catx("-", yyyy, mm);
							end; /* if mm ne ' ' */
						else outdate = strip(yyyy);
					end; /* if notdigit(yyyy) = 0 */
				else outdate = ' ';
			end; /* if indate ne ' ' */
		else outdate = ' ';
		return(outdate); /*[8]*/
	endsub; /*[9]*/
run;

Ready to join fellow brilliant minds for the SAS Hackathon?

Build your skills. Make connections. Enjoy creative freedom. Maybe change the world. Registration is now open through August 30th. Visit the SAS Hackathon homepage.

Register today!
What is Bayesian Analysis?

Learn the difference between classical and Bayesian statistical approaches and see a few PROC examples to perform Bayesian analysis in this video.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 1 reply
  • 440 views
  • 0 likes
  • 1 in conversation