Как разбить строки в TXT в CSV в R? - PullRequest
0 голосов
/ 11 июня 2018

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

Текстовый файл содержит всю информацию о пациенте с указанием даты, а счета перечислены в соответствии с датой покупки (поскольку он является внутренним пациентом, счета будут больше).

Теперь я использовал следующий код для извлечения платежной информации одного конкретного перетаскивания.

library(readr)
library(dplyr)
data = grep("CAR016", readLines("ip.txt"), value = TRUE)%>% as.data.frame
head(data)
str(data)

, и получился следующий вывод:

> head(data)
                                                                                                                 .
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
> str(data)
'data.frame':   38 obs. of  1 variable:
 $ .: Factor w/ 38 levels "   4 14/03/2018 CAR016     CARDIAC MONITOR : PER DAY                 OTH         750.00  1 GEN     750.00 SGET",..: 1 2 3 4 5 6 7 8 9 10 ...

как можновидите, есть 38 строк в выводе, но он показывает только одну переменную.Теперь мне нужно разбить эти строки на столбцы (10 столбцов).

Как это сделать ??

Обновление:

Я использовал пакет stringr для удаления пробелов.Но после этого я не знаю, как перейти к разделению

Код:

library(readr)
library(stringr)

data = grep("CAR016", readLines("ip.txt"), value = TRUE) 


for (i in seq(1:length(data))) {
  data[i] =  str_replace_all(data[i],pattern='\\s+' , repl=" ")
}

head(data)

Вывод:

> head(data)
[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" 

Любая подсказка будет так благодарна.

Заранее спасибо.

1 Ответ

0 голосов
/ 11 июня 2018

Если формат файла 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...