R 读取包含数千个分隔符的数字列的csv

R 读取包含数千个分隔符的数字列的csv,r,csv,R,Csv,我试图读取的csv文件的格式如下: Date,x,y "2015/08/01","71,131","20,390" "2015/08/02","81,599","23,273" "2015/08/03","79,435","21,654" "2015/08/04","80,733","20,924" 分隔符是逗号,但每个值也用引号括起来,因为逗号用作分隔符。我尝试了从{readr}读取read.csv,read_csv和从{data.table}读取fread,我能做的最好的事情就是读取所有值

我试图读取的csv文件的格式如下:

Date,x,y
"2015/08/01","71,131","20,390"
"2015/08/02","81,599","23,273"
"2015/08/03","79,435","21,654"
"2015/08/04","80,733","20,924"
分隔符是逗号,但每个值也用引号括起来,因为逗号用作分隔符。我尝试了从{readr}读取
read.csv
read_csv
和从{data.table}读取
fread
,我能做的最好的事情就是读取所有值作为字符串,然后使用
作为.numeric
gsub
的组合将它们转换成数字

我还发现:它非常有用,但我的数据有很多列(不全是数字),我不想指定列类型


有什么想法吗?或者我应该开始学习吗?有趣的是,Excel可以很好地读取文件:)

您应该能够使用
read.csv
读取数据。这里有一个例子

#write data
write('Date,x,y\n"2015/08/01","71,131","20,390"\n"2015/08/02","81,599","23,273"\n"2015/08/03","79,435","21,654"\n"2015/08/04","80,733","20,924"',"test.csv")

#use "text" rather than "file" in read.csv
#perform regex substitution before using read.csv
#the outer gsub with '(?<=\\d),(\\d{3})(?!\\d)' performs the thousands separator substitution
#the inner gsub replaces all \" with '
read.csv(text=gsub('(?<=\\d),(\\d{3})(?!\\d)',
                   '\\1',
                   gsub("\\\"",
                        "'",
                        paste0(readLines("test.csv"),collapse="\n")),
                   perl=TRUE),
         header=TRUE,
         quote="'",
         stringsAsFactors=FALSE)

您应该能够使用
read.csv
读取数据。这里有一个例子

#write data
write('Date,x,y\n"2015/08/01","71,131","20,390"\n"2015/08/02","81,599","23,273"\n"2015/08/03","79,435","21,654"\n"2015/08/04","80,733","20,924"',"test.csv")

#use "text" rather than "file" in read.csv
#perform regex substitution before using read.csv
#the outer gsub with '(?<=\\d),(\\d{3})(?!\\d)' performs the thousands separator substitution
#the inner gsub replaces all \" with '
read.csv(text=gsub('(?<=\\d),(\\d{3})(?!\\d)',
                   '\\1',
                   gsub("\\\"",
                        "'",
                        paste0(readLines("test.csv"),collapse="\n")),
                   perl=TRUE),
         header=TRUE,
         quote="'",
         stringsAsFactors=FALSE)

使用
data.table
包,您可以按如下方式执行:

1:创建要转换的列名向量。在这种情况下,必须排除
日期

cols <- setdiff(names(dt),"Date")
这导致:

> dt
         Date     x     y
1: 2015/08/01 71131 20390
2: 2015/08/02 81599 23273
3: 2015/08/03 79435 21654
4: 2015/08/04 80733 20924

使用数据:

dt <- fread('Date,x,y
            "2015/08/01","71,131","20,390"
            "2015/08/02","81,599","23,273"
            "2015/08/03","79,435","21,654"
            "2015/08/04","80,733","20,924"')

dt使用
data.table
package,您可以按如下方式操作:

1:创建要转换的列名向量。在这种情况下,必须排除
日期

cols <- setdiff(names(dt),"Date")
这导致:

> dt
         Date     x     y
1: 2015/08/01 71131 20390
2: 2015/08/02 81599 23273
3: 2015/08/03 79435 21654
4: 2015/08/04 80733 20924

使用数据:

dt <- fread('Date,x,y
            "2015/08/01","71,131","20,390"
            "2015/08/02","81,599","23,273"
            "2015/08/03","79,435","21,654"
            "2015/08/04","80,733","20,924"')

dt最好的解决方案是在导出Excel工作表之前从中删除所有这些格式

否则,只需使用
lappy
转换每列:

df[c("x", "y")] <- lapply(df[c("x", "y")], function(x) as.numeric(gsub(",", "", x)))

df[c(“x”,“y”)]最好的解决方案是在导出Excel工作表之前从中删除所有这些格式

否则,只需使用
lappy
转换每列:

df[c("x", "y")] <- lapply(df[c("x", "y")], function(x) as.numeric(gsub(",", "", x)))

df[c(“x”,“y”)]你知道哪些列需要转换吗?@Jaap我猜,但至少它会正确地读取它。啊,刚才看到他们已经试过了。nvmDavid-我不确定这将实现什么。无论如何,我得到了这个错误:`预期的sep(''),但在检测类型时新行、EOF(或其他非打印字符)结束字段4(第一):输入新日期:(mm-dd-yy)`因为您需要以正确的格式读取它,我无法在注释中格式化它。我想你已经试过了。@Jaap-现在我知道了(大约40列)。不过,将来会添加一些列,我不希望每次都进行手动更改。你知道哪些列需要转换吗?@Jaap我猜,但至少它会正确读取。啊,刚才看到他们已经试过了。nvmDavid-我不确定这将实现什么。无论如何,我得到了这个错误:`预期的sep(''),但在检测类型时新行、EOF(或其他非打印字符)结束字段4(第一):输入新日期:(mm-dd-yy)`因为您需要以正确的格式读取它,我无法在注释中格式化它。我想你已经试过了。@Jaap-现在我知道了(大约40列)。但是,将来会添加列,我不希望每次都执行手动更改。@BogdanC请使用一些示例数据进行检查。很难说正则表达式是否能正确处理所有可能的输入。@cyro-wow!我根本没有考虑过正则表达式。我在一些真实数据上进行了测试,效果非常好,我喜欢不必调整列名或类型。谢谢大家!@Bogdance很高兴它成功了!顺便说一句:您可以通过包含引号
@BogdanC请使用一些示例数据进行检查。很难说正则表达式是否能正确处理所有可能的输入。@cyro-wow!我根本没有考虑过正则表达式。我在一些真实数据上进行了测试,效果非常好,我喜欢不必调整列名或类型。谢谢大家!@Bogdance很高兴它成功了!顺便说一句:您可以通过包含引号
,使正则表达式模式更具限制性(因此可能更安全)。