R - поиск значения валюты внутри текста - PullRequest
0 голосов
/ 09 июля 2020

Это должно быть легко, я пытаюсь проверить, содержится ли данное значение в данной строке. скажем:

x <- "epsi lorem epsi lorem epsi lorem epsi lorem epsi lorem 1 000€ epsi lorem epsi lorem epsi lorem"
y <- "1000"

цель - вернуть истину, если y находится в x.

проблема в том, что валюта имеет много параметров форматирования (пробелы, запятые, точки) как для десятичных, так и для тысячных разделители. (примечание: X заполняется при чтении счетов-фактур в формате PDF с помощью OCR), а y было введено вручную кем-то, читающим счет. Идея состоит в том, чтобы просто подтвердить, что человек не сделал ошибки)

Один из вариантов - попробовать их все с помощью grepl:

grepl("1000", x) | grepl("1 000", x) | grepl("1.000", x) | grepl("1,000", x)

Но с учетом десятичных разделителей, разделителей тысяч и миллионов все может варьироваться в зависимости от страны / программного обеспечения, это неразумно

Я также смотрел

length(agrep(y, x, max.distance = 2))

, но тогда «1000» превращается в «10», и я рискую получить правду для чего-то вроде «10 янв 2020. Стоимость = 150 €»

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

Большое спасибо, r2evans, удаление этих трех символов с помощью gsub значительно упрощает задачу. Также узнаем о perl. Это не полностью решает мою проблему, так как я бы хотел, чтобы что-то вроде этого также работало:

x <- "epsi 1000,00€ lorem"
y <- "1000"

Учитывая, что y было numeri c преобразовано в текст, у него не будет десятичных знаков в круглых числах , но счет-фактура вполне может. Я выберу небольшую адаптацию к этому:

fn.catch <- function(x,y) {
    y2 <- ifelse(grepl(".", y, fixed = TRUE), y, paste0(y, ".00"))
    return(
        grepl(paste0("(?!=[0-9])", gsub("[[:space:],.]", "", y ), "(?![0-9])"), gsub("[[:space:],.]", "", x), perl = TRUE)
        |
        grepl(paste0("(?!=[0-9])", gsub("[[:space:],.]", "", y2), "(?![0-9])"), gsub("[[:space:],.]", "", x), perl = TRUE)
    )
}

только для справки о том, что делает функция: переменная y2 является копией y с десятичными знаками «.00», если y изначально не Функция have them затем проверит, находится ли Y или Y2 на X, удаляя любые " ", "," или "." из X, Y и Y2. "(?!=[0-9])" и perl = true затем будут следить за тем, чтобы символы до и после найденного числа не были также числами, поэтому что-то вроде «1» не находится в «313»

К сожалению, это все еще не 100% защита от дурака поскольку он не защитит меня от неуместных десятичных знаков, скажем:

x <- "epsi 1234,56€ lorem" 
y <- "12345.6" 

(вернет ИСТИНА, когда это явно была человеческая ошибка), но я бы сказал, что он поймает почти все, большое спасибо @ r2evans

0 голосов
/ 10 июля 2020
grepl(paste0("(?!=[0-9])", y, "(?![0-9])"), gsub("[[:space:],.]", "", x), perl = TRUE)
# [1] TRUE

При этом удаляются пробелы, запятые и десятичные знаки из исходной строки,

gsub("[[:space:],.]", "", x)
# [1] "epsiloremepsiloremepsiloremepsiloremepsilorem1000epsiloremepsiloremepsilorem"

затем grepl ing (это настоящий глагол, честно) для вашего y число, когда ему не предшествует или не следует di git.

Он также работает, когда y является первым или последним компонентом строки:

grepl(paste0("(?!=[0-9])", y, "(?![0-9])"),
      c("1000", "a1000", "1000a", "10000", "a10000", "10000a"), perl = TRUE)
# [1]  TRUE  TRUE  TRUE FALSE FALSE FALSE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...