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

时间:2019-03-19 20:33:19

标签: r fread separator

我有一个表(具有100万以上的行),用'||'分隔在其中一列中使用该符号('|')。我无法用data.table的fread读取它,因为它只允许输入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 个答案:

答案 0 :(得分: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(v0.2.1)于2019-03-19创建

答案 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的方法非常相似)