我有一个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