R 中的数据整理:格式错误的输入定界文件,记录分散到多行 [readr]
Data Wrangling in R: Malformed input delimited file with records spreading to multiple lines [readr]
我有一个带分隔符的文件,在转储到平面文件时出现错误。
换行和溢出的多条记录另存为新行。
Table A
的尺寸为 n x 25
- 每条记录都包含在
"
中
- 一些记录分为 3 行 8、17 和 3 列。
用于更好地理解我要解释的内容的视觉效果:
"|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")
我有一个带分隔符的文件,在转储到平面文件时出现错误。 换行和溢出的多条记录另存为新行。
Table A
的尺寸为n x 25
- 每条记录都包含在
"
中
- 一些记录分为 3 行 8、17 和 3 列。
用于更好地理解我要解释的内容的视觉效果:
"|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")