Обработка выписки по кредитной карте с использованием str_match_all в R: как я могу пропустить все альфа-символы, но зафиксировать число в конце

Рассмотрим вектор символов в 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"  

Нам нужно преобразовать этот массив символов в матрицу с 3 переменными, используя str_match, чтобы первый столбец был датой, например. April 07 или March 20

Второй столбец должен содержать весь текст, начиная с конца «даты» до начала числа в конце. Все строки без числа в конце можно игнорировать.

В третьем столбце должно быть число с запятой и десятичной точкой.

Я много искал, но решения просто пропускают все начальные числа и соответствуют только последним 1 или двум цифрам.

я пытался

str_match_all(x,"(April [0-9]{2})(.+)([\\d,\\.]+)$")

Это соответствует первому столбцу, но второй столбец также содержит первые несколько цифр третьего столбца (число) в конце, а третий столбец содержит только последнюю цифру :-(

Я совершаю фундаментальную ошибку, и если она будет решена, моя выписка по кредитной карте может быть легко сохранена в матрице.

Любая помощь будет оценена.


person Lazarus Thurston    schedule 14.05.2017    source источник
comment
Каков ожидаемый результат для записи № 3?   -  person Steven Beaupré    schedule 14.05.2017
comment
@StevenBeaupré: ожидаемый результат — числовой для записи №3. Решение от Эндрю ниже сработало.   -  person Lazarus Thurston    schedule 16.05.2017


Ответы (1)


Я думаю, вы хотите 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,‌​\\.]+$)")
person Andrew Gustar    schedule 14.05.2017
comment
Спасибо, @andrew. Это сработало. PS: я упростил вопрос. На самом деле, есть список списков, содержащих страницы выписок по кредитным картам. Следовательно, выбор str-match-all - person Lazarus Thurston; 14.05.2017
comment
И я верю, что ты прав, @andrew. Мне не нужен str-match-all. Функция без _all работает так же хорошо. Благодарность - person Lazarus Thurston; 14.05.2017
comment
у нас есть ошибка в предложенном вами решении. Он не анализирует строки с номерами в центре (2-й столбец), например. "March 20 LINKEDIN-219*4710221 LINKEDIN.COM 6,000.00 " Эта строка не была выбрана предложенным регулярным выражением. Можете ли вы предложить изменение? Спасибо - person Lazarus Thurston; 15.05.2017
comment
Ах. Как насчет str_match(str_trim(x),"([A-Z][a-z]+\\s[0-9]{2})(.+\\s)([0-9,\\.]+$)") - person Andrew Gustar; 15.05.2017