使用colClass处理带引号的德语小数分隔符CSV:日期与数值读取问题
解决德语日期和数值格式的CSV读取问题
我明白你遇到的困扰了——用read.csv2能自动识别德语风格的数值(逗号做小数分隔符),但想要跳过第三列并将第一列转为Date类型时,直接使用colClasses参数却无法生效。这主要是因为R默认的日期解析格式和德语的DD.MM.YYYY不匹配,同时用read.table时还需要手动指定小数分隔符。下面给你几个可行的解决方案:
方案一:先读取再处理(简单直观)
先通过read.csv2完整读取数据,再移除不需要的列,最后手动转换日期格式。这种方式不需要复杂的参数设置,适合新手:
# 读取完整数据 df <- read.csv2(text='"Datum";"Betrag";"bla" "03.05.2018";"-48,50";"skip"', sep=';') # 移除第三列 df <- df[, -3] # 将第一列转换为Date类型,指定德语日期格式 df$Datum <- as.Date(df$Datum, format = "%d.%m.%Y") # 查看结果结构 str(df)
运行后你会看到Datum列已经是Date类型,Betrag列保持正确的数值类型。
方案二:一次性读取时指定自定义解析规则
如果想在读取阶段就完成所有处理,可以自定义一个日期解析函数,配合read.table的colClasses参数,同时记得指定小数分隔符为逗号:
# 定义德语日期解析函数 parse_german_date <- function(x) { as.Date(x, format = "%d.%m.%Y") } # 读取数据,指定列类型和小数分隔符 df <- read.table(text='"Datum";"Betrag";"bla" "03.05.2018";"-48,50";"skip"', sep=';', header = TRUE, colClasses = c('parse_german_date', 'numeric', 'NULL'), dec = ',') # 查看结果结构 str(df)
这里的关键是:
- 用自定义函数处理日期列,匹配
DD.MM.YYYY格式 - 手动设置
dec=',',确保德语数值被正确解析为numeric类型 - 用
"NULL"跳过第三列
方案三:用data.table高效处理(适合大数据)
如果你的数据量较大,推荐用data.table包的fread函数,它能自动识别多数格式,语法也更简洁:
library(data.table) df <- fread(text='"Datum";"Betrag";"bla" "03.05.2018";"-48,50";"skip"', sep=';', select = c(1, 2), # 直接指定要保留的列 colClasses = list(Date = "Datum"), # 指定日期列类型 dec = ',') # 查看结果结构 str(df)
fread会自动尝试识别日期格式,也可以通过date.format="%d.%m.%Y"手动指定,灵活性很高。
内容的提问来源于stack exchange,提问作者drmariod
相关产品推荐
相关产品推荐

