【问题标题】:Dealing with commas in a CSV file in sqldf在 sqldf 中处理 CSV 文件中的逗号
【发布时间】:2018-11-26 08:09:29
【问题描述】:

我在这里sqldf returns zero observations 用一个可重复的例子来跟进我的问题。

我发现问题可能来自其中一个单元格中的“逗号”(“1,500+”),我认为我必须使用此处建议的过滤器sqldf, csv, and fields containing commas,但我不知道如何定义我的过滤器。下面是代码:

library(sqldf)

df <- data.frame("a" = c("8600000US01770" , "8600000US01937"),
             "b"= c("1,500+" , "-"),
             "c"= c("***" , "**"),
             "d"= c("(x)" , "(x)"),
             "e"= c("(x)" , "(x)"),
             "f"= c(992 , "-"))

write.csv(df, 'df_to_read.csv')  

# 'df_to_read.csv' looks like this:
"","a","b","c","d","e","f"
1,8600000US01770,1,500+,***,(x),(x),992
2,8600000US01937,-,**,(x),(x),-

Housing <- file("df_to_read.csv")
Housing_filtered <- sqldf('SELECT * FROM Housing', file.format = list(eol="\n"))

当我运行此代码时,我收到以下错误:

connection_import_file(conn@ptr, name, value, sep, eol, skip) 中的错误:RS_sqlite_import: df_to_read.csv 第 2 行预期有 7 列数据,但找到了 8 列

【问题讨论】:

  • 你有没有试过打开df_to_read.csv看看你写完之后的样子?您能否在问题中也包含此内容?
  • @Tim Biegeleisen:我将其添加到我的问题中。
  • 从您帖子中的df_to_read.csv 文件的内容中删除"

标签: r csv comma sqldf


【解决方案1】:

最好的方法是清理您的文件一次,这样您以后就不必再担心同一问题的分析了。这应该可以帮助您:

Housing <- readLines("df_to_read.csv")                            # read the file

n <- 6             # number of separators expected = number of columns expected - 1

library(stringr)
ln_idx <- ifelse(str_count(Housing, pattern = ",") == n, 0 , 1)
which(ln_idx == 1)               # line indices with issue, includes the header row
#[1] 2

检查具体问题并在相同的索引处写回您的文件。例如第 (2) 行:

Housing[2]
#[1] "1,8600000US01770,1,500+,***,(x),(x),992"            # hmm.. extra comma

Housing[2] = "1,8600000US01770,1500+,***,(x),(x),992"     # removed the extra comma
writeLines(Housing, "df_to_read.csv")

现在一切正常,一切顺利:

Housing <- file("df_to_read.csv")
Housing_filtered <- sqldf('SELECT * FROM Housing') 

# Housing_filtered 
#               a      b   c   d   e   f
# 1 8600000US01770  1500+ *** (x) (x) 992
# 2 8600000US01937      -  ** (x) (x)   -

【讨论】:

  • 使用这种方法会发生以下错误:扫描错误(文件,what = "",sep = sep,quote = quote,nlines = 1,quiet = TRUE,:无效​​的 'sep' 值:必须是一个字节
  • @Mankind_008:在我的问题中,它在 df 上运行良好。但是,我在我的问题中试图模仿的文件是一个没有" 而只有, 的大型CSV 文件。使用sep = '"' 不起作用。抱歉,我的问题并不清楚。
  • 您应该创建一个与您的关注点完全匹配的示例,让其他人帮助您。不用担心。对你来说最好的方法是清理文件一次,我已经更新了答案让你开始。
  • @Mankind_008:谢谢。我有一个大约 300 行的大文件,其中单元格中存在不规则的,(例如:1,500+)。
  • 300个都属于同一列还是位置不规则。每行有多少个额外的逗号?
【解决方案2】:

问题来自阅读df$b 创建的专栏。该列中的第一个值包含逗号,因此sqldf() 函数将其视为分隔符。 解决此问题的一种方法是删除逗号或使用其他符号(如空格)。您也可以使用read.csv2.sql 函数:

library(sqldf)

df <- data.frame("a" = c("8600000US01770" , "8600000US01937"),
                 "b"= c("1,500+" , "-"),
                 "c"= c("***" , "**"),
                 "d"= c("(x)" , "(x)"),
                 "e"= c("(x)" , "(x)"),
                 "f"= c("992" , "-"))

write.csv(df, 'df_to_read.csv',row.names = FALSE )


Housing_filtered <- read.csv2.sql("df_to_read.csv", sql = "select * from file", header=TRUE)

【讨论】:

  • read.csv2.sql 需要很长时间才能打开我的大文件。关于使用其他分隔符或删除逗号,我应该在我的 CSV 文件中手动执行此操作吗?我有一个大文件,手动修改它并不容易。我的问题中的 df 是我所拥有的一个小例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-25
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-18
  • 2022-06-13
相关资源
最近更新 更多