R - извлечение информации из строки в общем формате - PullRequest
0 голосов
/ 18 декабря 2018

Это полное переписывание моего первоначального вопроса в попытке прояснить его и сделать его как можно более ответственным.Моя цель - написать функцию, которая принимает строку в качестве входных данных и возвращает содержащуюся в ней информацию в табличном формате.Вот два примера строк символов, с которыми столкнется функция:

s1 <- "  9 9875     Γεωργίου Άγγελος Δημήτρης       ΑΒ/Γ  Π/Π Β   00:54:05          167***\r"
s2 <- " 10 8954F    Smith John                      ΔΕΖ   N       ΔΕΝ ΕΚΚΙΝΗΣΕ        0\r"

(Для тех, кто читал мой оригинальный вопрос, для простоты это меньшие строки.)

The требуемый вывод будет:

 Rank  Code                      Name Club Class         Time Points
    9  9875 Γεωργίου Άγγελος Δημήτρης ΑΒ/Γ Π/Π Β     00:54:05    167
   10 8954F                Smith John  ΔΕΖ     N ΔΕΝ ΕΚΚΙΝΗΣΕ      0

Мне удалось разбить строку в зависимости от того, где есть пробел, используя:

strsplit(s1, " ")[[1]][strsplit(s1, " ")[[1]] != ""]

хотя более элегантное решение было дано Г. Гротендиком в комментариях ниже, используя:

unlist(strsplit(trimws(s1), " +"))

Это приводит к

"9" "9875" "Γεωργίου" "Άγγελος" "Δημήτρης" "ΑΒ/Γ" "Π/Π" "Β" "00:54:05" "167***\r"

Тем не менее, это все еще проблематично, так как "Γεωργίου" "Άγγελος" и "Δημήτρης" должны быть объединены в "Γεωργίου Άγγελος Δημήτρης" (обратите внимание, что число элементов может быть два ИЛИ три), и то же самое относится к "Π/Π" "Β", который должен быть объединен в "Π/Π Β".

Вопрос

Как я могу использовать дополнительную информацию, которая у меня есть, а именно:

  • Порядок элементов всегда будетбыть таким же
  • Данные Name будут состоять из двух или трехds
  • Данные Club (т. е. ΑΒ/Γ в s1 и ΔΕΖ в s2) будут взяты из предварительно определенного списка клубов (например, хранятся в символьном векторе с именем * 1050).*)
  • Данные Class (т. Е. Π/Π Β в s1 и N в s2) будут взяты из предварительно определенного списка классов (например, хранятся в символьном векторе с именем sClass)
  • Данные Points всегда будут содержать "\ r" и не будут содержать пробелов.

для получения требуемого результата выше?

1 Ответ

0 голосов
/ 19 декабря 2018

Определяя

sClub <- c("ΑΒ/Γ", "ΔΕΖ")
sClass <- c("Π/Π Β", "N")

мы можем сделать

library(stringr)
myfun <- function(s)
  gsub("\\*", "", trimws(str_match(s, paste0("^\\s*(\\d+)\\s*?(\\w+)\\s*?([\\w ]+)\\s*(", paste(sClub, collapse = "|"),")\\s*(", paste(sClass, collapse = "|"), ")(.*?)\\s*([^ ]*\r)"))[, -1]))

sapply(list(s1, s2), myfun)
#      [,1]                        [,2]          
# [1,] "9"                         "10"          
# [2,] "9875"                      "8954F"       
# [3,] "Γεωργίου Άγγελος Δημήτρης" "Smith John"  
# [4,] "ΑΒ/Γ"                      "ΔΕΖ"         
# [5,] "Π/Π Β"                     "N"           
# [6,] "00:54:05"                  "ΔΕΝ ΕΚΚΙΝΗΣΕ"
# [7,] "167"                       "0"     

То, как это работает, просто учитывает всю вашу дополнительную информацию и создает длинное регулярное выражение.Он заканчивается стиранием * и удалением начальных / конечных пробелов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...