在 R 中使用 str_match_all 处理信用卡对帐单:如何跳过所有字母字符但在末尾捕获数字
Processing Credit card statement using str_match_all in R: how can I skip all alpha characters but capture the number at the end
考虑 R 中的一个字符向量。如您所料,这是信用卡对帐单摘录(保存在变量 x 中)
[1] "Statement includes payments and charges received by April 20, 2017 May 11, 2017"
[2] "Statement Period From March 21 to April 20, 2017"
[3] "At April 20, 2017 250,000.00 175,836.16"
[4] "April 07 PAYMENT RECEIVED."
[5] "April 07 PAYMENT RECEIVED.THANK YOU 20,000.00"
[6] "March 20 GOOGLE *TRUECALLER G.CO/PAYHELP# 29.00"
[7] "April 20 SERVICE TAX (INCL SBC & KKC) 488.51"
[8] "April 20 FINANCE CHARGES 3,256.70"
我们需要使用 str_match 将此字符数组转换为 3 变量矩阵,以便第一列是日期,例如April 07
或 March 20
第二列应包含从 "date" 末尾到末尾数字开头的整个文本。所有末尾没有数字的行都可以忽略。
第三列必须包含带逗号和小数点的数字。
我搜索了很多,但解决方案只是跳过所有初始数字,只匹配最后一位或两位数字。
我试过了
str_match_all(x,"(April [0-9]{2})(.+)([\d,\.]+)$")
这与第一列匹配,但第二列末尾还包含第三列(数字)的前几位数字,第三列仅包含最后一位数字:-(
我犯了一个根本性的错误,如果这个问题得到解决,我的信用卡对帐单可以很容易地存储在矩阵中。
任何帮助将不胜感激。
我想你想要 str_match
,没有 _all
(因为每行只有一个)。试试这个...
str_match(x,"([A-Z][a-z]+\s[0-9]{2})([^0-9]+)([0-9,\.]+$)")
或者这个,如果有数字行作为文本中间部分的一部分...
str_match(str_trim(x),"([A-Z][a-z]+\s[0-9]{2})(.+\s)([0-9,\.]+$)")
考虑 R 中的一个字符向量。如您所料,这是信用卡对帐单摘录(保存在变量 x 中)
[1] "Statement includes payments and charges received by April 20, 2017 May 11, 2017"
[2] "Statement Period From March 21 to April 20, 2017"
[3] "At April 20, 2017 250,000.00 175,836.16"
[4] "April 07 PAYMENT RECEIVED."
[5] "April 07 PAYMENT RECEIVED.THANK YOU 20,000.00"
[6] "March 20 GOOGLE *TRUECALLER G.CO/PAYHELP# 29.00"
[7] "April 20 SERVICE TAX (INCL SBC & KKC) 488.51"
[8] "April 20 FINANCE CHARGES 3,256.70"
我们需要使用 str_match 将此字符数组转换为 3 变量矩阵,以便第一列是日期,例如April 07
或 March 20
第二列应包含从 "date" 末尾到末尾数字开头的整个文本。所有末尾没有数字的行都可以忽略。
第三列必须包含带逗号和小数点的数字。
我搜索了很多,但解决方案只是跳过所有初始数字,只匹配最后一位或两位数字。
我试过了
str_match_all(x,"(April [0-9]{2})(.+)([\d,\.]+)$")
这与第一列匹配,但第二列末尾还包含第三列(数字)的前几位数字,第三列仅包含最后一位数字:-(
我犯了一个根本性的错误,如果这个问题得到解决,我的信用卡对帐单可以很容易地存储在矩阵中。
任何帮助将不胜感激。
我想你想要 str_match
,没有 _all
(因为每行只有一个)。试试这个...
str_match(x,"([A-Z][a-z]+\s[0-9]{2})([^0-9]+)([0-9,\.]+$)")
或者这个,如果有数字行作为文本中间部分的一部分...
str_match(str_trim(x),"([A-Z][a-z]+\s[0-9]{2})(.+\s)([0-9,\.]+$)")