强制 readr 中的 read_delim 将多个 " 和 \ 作为列字符串的一部分
Forcing read_delim in readr to treat multiple " and \ as part of column string
给定一个 ;
分隔文件的结构:
colA; colB; colC
1;A; 10
2;B; 11
3;C"; 12
4;D""; 15
5;"F";20
6;K"""; 21
7;""M";22
8; \""O;23
我想确保 colB
始终作为字符串逐字导入。特别是,我想保留所有值,包括 ""M"
和 \""O
.
尝试
我目前正在尝试:
require(readr)
tst_dta <- read_delim(
file = "test_file.csv",
escape_double = FALSE,
delim = ";",
col_types = cols(
colA = col_integer(),
colB = col_character(),
colC = col_integer()
)
)
但是这个returns:
> tst_dta
# A tibble: 8 x 3
colA colB colC
<int> <chr> <int>
1 1 A 10
2 2 B NA
3 3 "C\"" 12
4 4 "D\"\"" 15
5 5 F 20
6 6 "K\"\"\"" 21
7 7 "\"\"M\"" 22
8 8 " \\"\"O" 23
想要的结果
期望的结果应该反映:
colA colB colC
<int> <chr> <int>
1 A 10
2 B 11
3 C" 12
4 D"" 15
5 "F" 20
6 K""" 21
7 ""M" 22
8 \""O 23
其他要点:
- 理想情况下,我还想确保忽略非 ASCII 字符,这样值
\""[Non-ASCII-Character]O
将作为 \""O
字符串出现在结果数据框中。
更新
根据评论,更多示例:
是:
colA; colB; colC
1; text \" text; 2
应该是:
colA;colB;colC
1;text text;2
是:
colA; colB; colC
1; text \;" text; 2
应该是:
colA;colB;colC
1;text text;2
是:
colA; colB; colC
1; [non-ASCII] text something \;" text; 2
应该是:
colA;colB;colC
1;text something;2
如果您需要使用 readr
函数,请查看它的参数列表,看看它是否具有等同于 read.table
中的 quote
参数(允许简单访问:
read.table(text=txt, header=TRUE, quote="", sep=";")
colA colB colC
1 1 A 10
2 2 B 11
3 3 C" 12
4 4 D"" 15
5 5 "F" 20
6 6 K""" 21
7 7 ""M" 22
8 8 ""O 23
似乎应该成功,因为它是 readr::read_delim
中的第三个参数。两种情况下的默认值都是 "\""
,这是一个双引号。设置为空字符(""
):
用法
read_delim(file, delim, quote = "\"", escape_backslash = FALSE,
escape_double = TRUE, col_names = TRUE, col_types = NULL,
locale = default_locale(), na = c("", "NA"), quoted_na = TRUE,
comment = "", trim_ws = FALSE, skip = 0, n_max = Inf,
guess_max = min(1000, n_max), progress = show_progress())
这是结果的打印表示。我会注意到这个打印表示似乎有点不规则。字符值包含在双引号中 只有 如果它们嵌入了双引号,即 \"
。另一方面,这些列 是 字符,这是对 read.table 中默认设置的一个很好的更改,它为您提供因子列:
read_delim(file=txt, quote="", delim=";")
# A tibble: 8 x 3
colA ` colB` ` colC`
<int> <chr> <chr>
1 1 A " 10"
2 2 B " 11 "
3 3 "C\"" " 12"
4 4 "D\"\"" " 15"
5 5 "\"F\"" 20
6 6 "K\"\"\"" " 21"
7 7 "\"\"M\"" 22
8 8 " \"\"O" 23
特此警告您,将此选项与 read_delim
一起使用确实意味着不会修剪列名和值以删除空格。 所有内容 都是 character
,即使是那些本来会以 character
形式出现的列。注意第二列的名称。 read.table
不会发生这种情况:
read_delim(file=txt, quote="", delim=";")$` colB` ==
read.table(text=txt, header=TRUE, quote="", sep=";")$colB
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
如果您想要删除前导或尾随空格,则需要进一步 gsub
处理。 rm_non_ascii
pkg {qdapRegex} 中可以删除非 ASCII 字符
给定一个 ;
分隔文件的结构:
colA; colB; colC
1;A; 10
2;B; 11
3;C"; 12
4;D""; 15
5;"F";20
6;K"""; 21
7;""M";22
8; \""O;23
我想确保 colB
始终作为字符串逐字导入。特别是,我想保留所有值,包括 ""M"
和 \""O
.
尝试
我目前正在尝试:
require(readr)
tst_dta <- read_delim(
file = "test_file.csv",
escape_double = FALSE,
delim = ";",
col_types = cols(
colA = col_integer(),
colB = col_character(),
colC = col_integer()
)
)
但是这个returns:
> tst_dta
# A tibble: 8 x 3
colA colB colC
<int> <chr> <int>
1 1 A 10
2 2 B NA
3 3 "C\"" 12
4 4 "D\"\"" 15
5 5 F 20
6 6 "K\"\"\"" 21
7 7 "\"\"M\"" 22
8 8 " \\"\"O" 23
想要的结果
期望的结果应该反映:
colA colB colC
<int> <chr> <int>
1 A 10
2 B 11
3 C" 12
4 D"" 15
5 "F" 20
6 K""" 21
7 ""M" 22
8 \""O 23
其他要点:
- 理想情况下,我还想确保忽略非 ASCII 字符,这样值
\""[Non-ASCII-Character]O
将作为\""O
字符串出现在结果数据框中。
更新
根据评论,更多示例:
是:
colA; colB; colC
1; text \" text; 2
应该是:
colA;colB;colC
1;text text;2
是:
colA; colB; colC
1; text \;" text; 2
应该是:
colA;colB;colC
1;text text;2
是:
colA; colB; colC
1; [non-ASCII] text something \;" text; 2
应该是:
colA;colB;colC
1;text something;2
如果您需要使用 readr
函数,请查看它的参数列表,看看它是否具有等同于 read.table
中的 quote
参数(允许简单访问:
read.table(text=txt, header=TRUE, quote="", sep=";")
colA colB colC
1 1 A 10
2 2 B 11
3 3 C" 12
4 4 D"" 15
5 5 "F" 20
6 6 K""" 21
7 7 ""M" 22
8 8 ""O 23
似乎应该成功,因为它是 readr::read_delim
中的第三个参数。两种情况下的默认值都是 "\""
,这是一个双引号。设置为空字符(""
):
用法
read_delim(file, delim, quote = "\"", escape_backslash = FALSE,
escape_double = TRUE, col_names = TRUE, col_types = NULL,
locale = default_locale(), na = c("", "NA"), quoted_na = TRUE,
comment = "", trim_ws = FALSE, skip = 0, n_max = Inf,
guess_max = min(1000, n_max), progress = show_progress())
这是结果的打印表示。我会注意到这个打印表示似乎有点不规则。字符值包含在双引号中 只有 如果它们嵌入了双引号,即 \"
。另一方面,这些列 是 字符,这是对 read.table 中默认设置的一个很好的更改,它为您提供因子列:
read_delim(file=txt, quote="", delim=";")
# A tibble: 8 x 3
colA ` colB` ` colC`
<int> <chr> <chr>
1 1 A " 10"
2 2 B " 11 "
3 3 "C\"" " 12"
4 4 "D\"\"" " 15"
5 5 "\"F\"" 20
6 6 "K\"\"\"" " 21"
7 7 "\"\"M\"" 22
8 8 " \"\"O" 23
特此警告您,将此选项与 read_delim
一起使用确实意味着不会修剪列名和值以删除空格。 所有内容 都是 character
,即使是那些本来会以 character
形式出现的列。注意第二列的名称。 read.table
不会发生这种情况:
read_delim(file=txt, quote="", delim=";")$` colB` ==
read.table(text=txt, header=TRUE, quote="", sep=";")$colB
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
如果您想要删除前导或尾随空格,则需要进一步 gsub
处理。 rm_non_ascii
pkg {qdapRegex} 中可以删除非 ASCII 字符