强制readr中的read_delim将多个“和\视为列字符串的一部分

时间:2018-06-21 13:58:49

标签: r csv import special-characters readr

给出一个 ; 分隔的结构文件:

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

1 个答案:

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