R中使用read.csv.sql读取大CSV时‘line x did not have y elements’错误解决
解决大TSV文件读取问题的方案
一、修复sqldf的read.csv.sql报错
你遇到的错误是因为部分行的字段数量和表头不一致,read.csv的fill=TRUE参数可以直接传递给read.csv.sql。另外Open Food Facts数据里常存在干扰分隔识别的引号,建议同时加上quote=""参数,修改后的代码如下:
library(sqldf) library(here) read.csv.sql( here("02. Data", "en.openfoodfacts.org.products.csv"), sep = "\t", fill = TRUE, quote = "" )
如果想先验证格式是否正常,可以用SQL语句只读取前100行测试:
read.csv.sql( here("02. Data", "en.openfoodfacts.org.products.csv"), sep = "\t", fill = TRUE, quote = "", sql = "SELECT * FROM file LIMIT 100" )
二、更适合大文件的R工具
对于7GB级别的大文件,以下工具比sqldf更高效友好,且不需要额外的SQL知识:
1. data.table::fread
fread是专为大文件设计的读取函数,速度快,自动处理字段数不一致、特殊字符等问题,默认会自动填充缺失字段:
library(data.table) dt <- fread(here("02. Data", "en.openfoodfacts.org.products.csv"), sep = "\t")
如果只需要部分列,可用select参数指定,大幅减少内存占用:
dt <- fread(here("02. Data", "en.openfoodfacts.org.products.csv"), sep = "\t", select = c("product_name", "brands", "energy_100g"))
2. vroom::vroom
vroom采用列式读取模式,比传统行读取快数倍,内存占用极低,默认支持延迟加载(仅在需要时加载数据到内存),自动处理字段缺失:
library(vroom) df <- vroom(here("02. Data", "en.openfoodfacts.org.products.csv"), delim = "\t")
3. readr::read_delim
属于tidyverse生态,读取逻辑稳定,支持通过指定列类型进一步压缩内存:
library(readr) df <- read_delim(here("02. Data", "en.openfoodfacts.org.products.csv"), delim = "\t", show_col_types = FALSE, fill = TRUE)
内容的提问来源于stack exchange,提问作者Jay Bee
相关产品推荐
相关产品推荐

