使用 SAS 从文本中解析时间
Parsing Time from text using SAS
对于其中包含日期和时间的数千条记录,我的文本长度最多为 200 个字符。我正在尝试解析时间
这是我的text
示例
Your account your account your account on Jan 10, 2020 at 8.30 AM ET your account
Your account your account your account on Jan 3, 2020 6.30PM ET your account
Your account your account your account on Jan 11, 2020 at 6.30PM ET your account
期望的输出
8.30 AM
6.30PM
6.30PM
在所有内容中ET
是常见的,我使用index
和substr
函数来解析时间。
Time=substr(Text,index(Text,' on ')+19,6);
对于第二行,我也得到了额外的字符,因为时间和 PM
之间没有 at
也没有 space
有什么有效的时间解析方法吗?
谢谢
SAS 可以使用具有捕获缓冲区的 Perl 正则表达式定位文本摘录。
data want(keep=parsed_timestring);
length parsed_timestring ;
input;
/* Pattern:
* On a word boundary \b
* Capture start (
* 1 or 2 digits \d{1,2}
* A period \.
* 1 or 2 digits \d{1,2}
* 0 or 1 spaces \s?
* letter A or P (A|P)
* letter M M
* Capture end )
*/
prx = prxparse('/\b(\d{1,2}\.\d{1,2}\s?(A|P)M)/x');
if prxmatch (prx, _infile_) then
parsed_timestring = prxposn(prx,1,_infile_);
datalines;
Your account your account your account on Jan 10, 2020 at 8.30 AM ET your account
Your account your account your account on Jan 3, 2020 6.30PM ET your account
Your account your account your account on Jan 11, 2020 at 6.30PM ET your account
Your account your account your account on Jan 11, 2020 at 6666.30PM ET your account
;
proc print;
run;
最后一行 parsed_timestring
是空白的,因为 6666.30PM
以 两个以上的数字开始 在单词边界上因此不会匹配模式和因此该行将没有适当的时间字符串。
对于其中包含日期和时间的数千条记录,我的文本长度最多为 200 个字符。我正在尝试解析时间
这是我的text
示例
Your account your account your account on Jan 10, 2020 at 8.30 AM ET your account
Your account your account your account on Jan 3, 2020 6.30PM ET your account
Your account your account your account on Jan 11, 2020 at 6.30PM ET your account
期望的输出
8.30 AM
6.30PM
6.30PM
在所有内容中ET
是常见的,我使用index
和substr
函数来解析时间。
Time=substr(Text,index(Text,' on ')+19,6);
对于第二行,我也得到了额外的字符,因为时间和 PM
之间没有at
也没有 space
有什么有效的时间解析方法吗?
谢谢
SAS 可以使用具有捕获缓冲区的 Perl 正则表达式定位文本摘录。
data want(keep=parsed_timestring);
length parsed_timestring ;
input;
/* Pattern:
* On a word boundary \b
* Capture start (
* 1 or 2 digits \d{1,2}
* A period \.
* 1 or 2 digits \d{1,2}
* 0 or 1 spaces \s?
* letter A or P (A|P)
* letter M M
* Capture end )
*/
prx = prxparse('/\b(\d{1,2}\.\d{1,2}\s?(A|P)M)/x');
if prxmatch (prx, _infile_) then
parsed_timestring = prxposn(prx,1,_infile_);
datalines;
Your account your account your account on Jan 10, 2020 at 8.30 AM ET your account
Your account your account your account on Jan 3, 2020 6.30PM ET your account
Your account your account your account on Jan 11, 2020 at 6.30PM ET your account
Your account your account your account on Jan 11, 2020 at 6666.30PM ET your account
;
proc print;
run;
最后一行 parsed_timestring
是空白的,因为 6666.30PM
以 两个以上的数字开始 在单词边界上因此不会匹配模式和因此该行将没有适当的时间字符串。