给出一个 ;
分隔的结构文件:
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()
)
)
但这返回:
> 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
\""[Non-ASCII-Character]O
在字符串\""O
中出现的方式忽略非ASCII字符。根据评论,更多示例:
是:
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
答案 0 :(得分:1)
如果需要使用readr
函数,请查看它的参数列表,看看它是否等效于quote
中的read.table
参数(允许简单访问:< / p>
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
处理。 pkg {qdapRegex}中的rm_non_ascii
可以删除非ASCII字符