r语言 - 用readr::read_csv转义字符串



我有一个CSV文件,其中数字以字符串形式转义,小数点标记是逗号。我有理由相信我以前使用过readr::read_cvs来解析这样的文件,虽然这是几年前的事了,但我现在遇到了麻烦。它看起来就像"不被认为是带引号的字符串。

如果我这样做:

> # This will go okay, except for an unecessary warning
> read_csv(
+     'A, B, C,    D,      E
+     $1, a, a,  1.2%,  "1,100,200"
+     $2, b, b,  2.1%,  "  140,000"
+     $3, c, c, 13.0%,  "2,005,000"',
+     col_types = "nccnn"
+ )
# A tibble: 3 × 5                                                                                                                       
A B     C         D       E
<dbl> <chr> <chr> <dbl>   <dbl>
1     1 a     a       1.2 1100200
2     2 b     b       2.1  140000
3     3 c     c      13   2005000
Warning message:
One or more parsing issues, see `problems()` for details 

我可以解析数据。我得到的警告是,第1行到第3行中的列数是错误的(如果字符串中的逗号被算作字段分隔符,那么它们就是错误的,否则就不是)。即使read_csv()认为列数是错误的,它也会正确解析最后一列中的数字。

如果我有一个","是小数点和";如果没有分组标记,则完全丢失最后一列:

> # This will go all wrong, because the locale is not respected if ',' is a separator inside a string
> read_csv(
+     'A, B, C,    D,      E
+     $1, a, a,  " 1,2%",  "1.100.200"
+     $2, b, b,  " 2,1%",  "  140.000"
+     $3, c, c, "13,0%",  "2.005.000"',
+     locale=locale(decimal_mark = ",", grouping_mark = "."),
+     col_types = "nccnn")
# A tibble: 3 × 5                                                                                                                       
A B     C         D     E
<dbl> <chr> <chr> <dbl> <dbl>
1     1 a     a         1     2
2     2 b     b         2     1
3     3 c     c        13     0
Warning message:
One or more parsing issues, see `problems()` for details 

警告与之前相同,但发生的情况是百分比中的逗号被解释为字段分隔符——就好像它们没有在字符串中被引用一样——并且百分比的两个部分被分成两列(最后一列被完全抛弃)。

字符串不应该引用逗号,这样它们就不会被解释为字段分隔符吗?如果没有,是否存在不涉及更改输入文件的工作?

问题似乎是命令之间的空格和引号的开始。你的实际数据中有这些空格吗?还是你只是为了让例子看起来更漂亮而把它们放在那里?

library(readr)
read_csv(
'A,B,C,D,E
$1,a,a," 1,2%","1.100.200"
$2,b,b," 2,1%","  140.000"
$3,c,c,"13,0%","2.005.000"',
locale=locale(decimal_mark = ",", grouping_mark = "."),
col_types = "nccnn")
#       A B     C         D       E
#   <dbl> <chr> <chr> <dbl>   <dbl>
# 1     1 a     a       1.2 1100200
# 2     2 b     b       2.1  140000
# 3     3 c     c      13   2005000

最新更新