Если формат файла fixed
(как показано в примере), то одним из вариантов может быть использование tidyr::extract
с regex
для выбора 10 столбцов следующим образом:
library(tidyverse)
grep("CAR016", readLines("ip.txt"), value = TRUE)%>%
as.data.frame() %>% # Assuming 10 columns will be part of data
extract(., ., paste("Col",1:10,sep="_"),
regex = "(^\\d+)\\s(\\d{2}/\\d{2}/\\d{4})\\s([:alnum:]+)\\s+([A-Z :]+)\\s+(\\w+)\\s+([0-9.]+)\\s+(\\d+)\\s+([:alnum:]+)\\s+([0-9.]+)\\s+(.*$)")
Результат:
# Col_1 Col_2 Col_3 Col_4 Col_5 Col_6 Col_7 Col_8 Col_9 Col_10
# 1 4 14/03/2018 CAR016 CARDIAC MONITOR : PER DAY OTH 750.00 1 GEN 750.00 SGET
# 2 5 15/03/2018 CAR016 CARDIAC MONITOR : PER DAY OTH 750.00 1 GEN 750.00 SGET
# 3 6 16/03/2018 CAR016 CARDIAC MONITOR : PER DAY OTH 750.00 1 GEN 750.00 SGET
# 4 7 18/03/2018 CAR016 CARDIAC MONITOR : PER DAY OTH 750.00 1 GEN 750.00 Suji
# 5 8 19/03/2018 CAR016 CARDIAC MONITOR : PER DAY OTH 750.00 1 GEN 750.00 NISHAN
# 6 9 20/03/2018 CAR016 CARDIAC MONITOR : PER DAY OTH 750.00 1 GEN 750.00 mam
Regex Объяснение:
Нам нужно 10 групп, чтобы представить 10 столбцов, как ожидается tidyr::extract
.
(^\\d+) -- Group1 : Start with digits of any size
\\s -- space
(\\d{2}/\\d{2}/\\d{4}) -- Group2 : Date
\\s -- space
([:alnum:]+) -- Group3 : Any number of continuous alpha-numeric
\\s+ -- 1+ number of spaces
([A-Z :]+) -- Group4 : Any number of Character in upper case, : or space
\\s+ -- 1+ number of spaces
(\\w+) -- Group5 : 1+ number of word characters
\\s+ -- 1+ number of spaces
([0-9.]+) -- Group6 : Digits with .
\\s+
(\\d+) -- Group7 : 1+ digits
\\s+
([:alnum:]+) -- Group8 : 1+ numbers of continuous alpha-numeric
\\s+
([0-9.]+) -- Group9 : Digits with .
\\s+
(.*$) -- Group10 : Anything left till end character.
Отредактировано: Опция # 2
В соответствии с запросом от OP несколько пробелов заменены одним пробелом.После этого можно использовать tidyr::separate
(поскольку число столбцов фиксировано), чтобы разделить столбцы в разделителе (sep = " ")
.Наконец, нужно собрать unite
4-8 столбцы вместе.Решение будет таким:
library(tidyverse)
data <-
grep("CAR016", readLines("d:\\ip.txt"), value = TRUE)%>%
as.data.frame() %>% rename(., V1 = .) %>%
mutate(V1 = gsub("\\s+", " ",V1)) %>%
separate("V1", sprintf("Col_%02d",1:14), sep = " ") %>%
unite(V1_04, c("Col_04", "Col_05", "Col_06", "Col_07", "Col_08"), sep = " ")
data
# Col_01 Col_02 Col_03 V1_04 Col_09 Col_10 Col_11 Col_12 Col_13 Col_14
# 1 4 14/03/2018 CAR016 CARDIAC MONITOR : PER DAY OTH 750.00 1 GEN 750.00 SGET
# 2 5 15/03/2018 CAR016 CARDIAC MONITOR : PER DAY OTH 750.00 1 GEN 750.00 SGET
# 3 6 16/03/2018 CAR016 CARDIAC MONITOR : PER DAY OTH 750.00 1 GEN 750.00 SGET
# 4 7 18/03/2018 CAR016 CARDIAC MONITOR : PER DAY OTH 750.00 1 GEN 750.00 Suji
# 5 8 19/03/2018 CAR016 CARDIAC MONITOR : PER DAY OTH 750.00 1 GEN 750.00 NISHAN
# 6 9 20/03/2018 CAR016 CARDIAC MONITOR : PER DAY OTH 750.00 1 GEN 750.00 mam