R 中的数据整理:格式错误的输入定界文件,记录分散到多行 [readr]

Data Wrangling in R: Malformed input delimited file with records spreading to multiple lines [readr]

我有一个带分隔符的文件,在转储到平面文件时出现错误。 换行和溢出的多条记录另存为新行。

用于更好地理解我要解释的内容的视觉效果:

    "|A|B|C|D|E|F|...|X|Y|"
[1] "|1|2|3|2|1|1|...|4|1|"
[2] "|2|3|4|4|5|1|...|0|0|"
[3] "|8|7|6|7|...
[4]  |7|9|1|....
[5]  |2|3|7|"

请注意,TableA[3] 现在被分成第 3 行到第 5 行,并且只引用了第 3 行和第 5 行。


我使用了包 readr 中的 read_delim,参数如下

##Attempt 1
read_delim("data/TableA.txt",delim = "|",col_names = T)
## Strangely resulting in an nx1 table, without any parsing done.

##Attempt 2
read_delim("data/TableA.txt",delim = "|",col_names = T,quote="")
## Results in a parsed nx25 tibble like this:

\"A  B  C  D  E  F  ...  X  Y\"
\"1  2  3  2  1  1  ...  4  1\"
\"2  3  4  4  5  1  ...  0  0\"
\"8  7  6  7  
  7  9  1
  2  3  7\"                                "

problems(TableA) ##outputs:
# A tibble: 6 x 5
    row col   expected   actual     file              
  <int> <chr> <chr>      <chr>      <chr>             
1    26 NA    26 columns 8 columns  'data/TableA.txt'
2    27 NA    26 columns 17 columns 'data/TableA.txt'
3    28 NA    26 columns 3 columns  'data/TableA.txt'
4   160 NA    26 columns 8 columns  'data/TableA.txt'
5   161 NA    26 columns 17 columns 'data/TableA.txt'
6   162 NA    26 columns 3 columns  'data/TableA.txt'

分别注意第一个和最后一个变量名开头和结尾处的 q 标记,其值也相同。当我尝试 quote='"'quote="\"" 得到与 Attempt 1.

相同的结果时

我想知道是否有办法通过参数化来解决这个问题 readr::read_delim正确


编辑: 这是出于隐私原因 dput(readLines("data/TableA.txt")) 我 "hashed" 一些数据的输出。

元素 1 和 5 的形式正确。 2 -> 4 描述了问题。

c("\"8x9|x|x|x|x|x|x|47|SDPA|Colmados|COMERCIAL||||||Unknown|Unknown|Unknown|HAINA|SANTO DOMINGO|||47|809|x\"", 
"\"8x9|x|x|x|SECUNDARIO|x|x|15", 
"|SDPA|x|||x||0x2xx8|xxx6|Unknown|Unknown|Unknown|xS|SxxGO|||15", 
"|8x9|xx4\"", "\"809|3xx00|xx|Sxx|PRINCIPAL|DISTRITO NACIONAL|xxxx|86|SDPA|Bexxs|COMERCIAL||vexsxxcom|www.axx.do|00x54|1xx-7|[=12=] - M|0 - 25|[=12=] - 0K|LOxS|Santo Domingo|||86|8xx9|33xx0\""
)

SO 的问题应该包括一个完整的最小可重现示例,但由于有 none 我们在末尾的注释中包含了一个,假设每条记录是一行 6 个字段或 6 个字段按顺序分成三行 3、2 和 1 字段。

计算每行的字段数并合并多行字段。终于重温了。

library(readr)

cnt <- count_fields("nzam.dat", tokenizer_delim("|"))
L <- read_lines("nzam.dat")
L2 <- tapply(L, cumsum(cnt == 6 | cnt == 3), paste, collapse = "|")
read_delim(L2, delim = "|", col_names = FALSE, col_types = NULL, trim_ws = TRUE)

给予:

# A tibble: 3 x 6
     X1    X2    X3    X4    X5    X6
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1     1     2     3     4     5     6
2    10    11    12    17    18    21
3     1     2     3     4     5     6

另一种仅使用基础 R 的方法如下。请注意,what = 0 指定所有条目均为数字。

 s <- scan("nzam.dat", what = 0, sep = "|", quiet = TRUE)
 as.data.frame(matrix(s, ncol = 6, byrow = TRUE))

备注

Lines <- "1|2|3|4|5|6
10|11|12
17|18
21
1|2|3|4|5|6"
cat(Lines, file = "nzam.dat")