r读取2个字符的数据分隔符

问题描述 投票:1回答:2

我有一个表(超过100万行),由'||'分隔在其中一列中使用该符号('|')。我无法通过data.table中的fread读取它,因为它只允许1个char的长度,而不是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

谢谢!

r fread separator
2个回答
2
投票

您可以读取整行,然后使用正则表达式来分割线条。你必须添加一些列名称才能使它成为一个数据帧,所以我只使用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

reprex package创建于2019-03-19(v0.2.1)


0
投票

在一列中读入您的数据:

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非常相似)

© www.soinside.com 2019 - 2024. All rights reserved.