强制 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

其他要点:


更新

根据评论,更多示例:

是:

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 字符