r чтение разделителя данных с 2 символами - PullRequest
1 голос
/ 19 марта 2019

У меня есть таблица (с более чем 1 миллионом строк), разделенная '||'и внутри одного из столбцов используется этот символ ('|').Я не мог прочитать его с помощью fread из data.table, потому что он допускает длину только 1 символ, ни с read.table.Примером строк будет:

 1-Xxxxx||5804||CONTROL REMOTO 5804/5834 - xxxx||31/5/2018 03:00:00||CALLE     EL QUIYA CASA 99, MANZANA 99, - SECCION 8, CIRCUNSCRIPCION 4°|? -(xxxx) (CIUDAD)||2

, где следующее было только в одном поле, но имеет символ '|':

 CALLE EL QUIYA CASA 99, MANZANA 99, - SECCION 8, CIRCUNSCRIPCION 4°|? - (xxxx) (CIUDAD)

Требуемое разделение:

field1= 1-Xxxxx
field2= 5804
field3= CONTROL REMOTO 5804/5834 - HONEYWELL
field4=31/5/2018 03:00:00
field5=CALLE EL QUIYA CASA 99, MANZANA 99, - SECCION 8, CIRCUNSCRIPCION 4°|? - () (CIUDAD EVITA )
field6= 2

Спасибо!

Ответы [ 2 ]

2 голосов
/ 19 марта 2019

Вы можете читать целые строки, а затем использовать регулярные выражения для разбиения строк. Вы должны добавить несколько имен столбцов, чтобы превратить их в информационный кадр, поэтому я просто использовал a-f, но заменил его своим собственным. Вы также должны иметь возможность заменить lines на путь к вашему текстовому файлу, здесь я просто использую буквальные данные в качестве примера.

library(tidyverse)
line <- " 1-Xxxxx||5804||CONTROL REMOTO 5804/5834 - xxxx||31/5/2018 03:00:00||CALLE     EL QUIYA CASA 99, MANZANA 99, - SECCION 8, CIRCUNSCRIPCION 4°|? -(xxxx) (CIUDAD)||2"
lines <- c(line, line)
line_list <- read_lines(lines) %>%
  str_split("\\|\\|") %>% 
  map(~set_names(., letters[1:6]))
bind_rows(!!!line_list)
#> # A tibble: 2 x 6
#>   a       b     c              d         e                            f    
#>   <chr>   <chr> <chr>          <chr>     <chr>                        <chr>
#> 1 " 1-Xx… 5804  CONTROL REMOT… 31/5/201… CALLE     EL QUIYA CASA 99,… 2    
#> 2 " 1-Xx… 5804  CONTROL REMOT… 31/5/201… CALLE     EL QUIYA CASA 99,… 2

Создано в 2019-03-19 с помощью пакета представительства (v0.2.1)

0 голосов
/ 20 марта 2019

Читайте ваши данные в одном столбце:

d <- data.table::fread(text = 
'1-Xxxxx||5804||CONTROL REMOTO 5804/5834 - xxxx||31/5/2018 03:00:00||CALLE     EL QUIYA CASA 99, MANZANA 99, - SECCION 8, CIRCUNSCRIPCION 4°|? -(xxxx) (CIUDAD)||2
 1-Xxxxx||5804||CONTROL REMOTO 5804/5834 - xxxx||31/5/2018 03:00:00||CALLE     EL QUIYA CASA 99, MANZANA 99, - SECCION 8, CIRCUNSCRIPCION 4°|? -(xxxx) (CIUDAD)||2', 
  sep = '', data.table = FALSE, header = FALSE) 

Разделяйте столбцы:

tidyr::separate(d, V1, into = paste('V', 1:6), sep = '\\|\\|', covert = TRUE)
      V 1  V 2                             V 3                V 4
1 1-Xxxxx 5804 CONTROL REMOTO 5804/5834 - xxxx 31/5/2018 03:00:00
2 1-Xxxxx 5804 CONTROL REMOTO 5804/5834 - xxxx 31/5/2018 03:00:00
                                                                                         V 5 V 6
1 CALLE     EL QUIYA CASA 99, MANZANA 99, - SECCION 8, CIRCUNSCRIPCION 4°|? -(xxxx) (CIUDAD)   2
2 CALLE     EL QUIYA CASA 99, MANZANA 99, - SECCION 8, CIRCUNSCRIPCION 4°|? -(xxxx) (CIUDAD)   2

Измените paste('V', 1:6) на ваши фактические имена столбцов.

(Этот подход очень похож на подход @CalumYou)

...