使用read.csv.sql读取20GB CSV文件遇列数不匹配错误求助
问题原因与解决办法
核心原因:两个函数的CSV解析规则存在差异
read.csv默认启用fill=TRUE参数,当某行列数与表头不一致时,会自动用NA填充缺失列或截断多余列,所以前10000条数据里即使第262行有38列,也能正常加载不报错。read.csv.sql依赖SQLite引擎导入完整CSV文件(执行SQL筛选必须先将全量数据导入临时数据库),而SQLite导入要求每行列数必须与表头严格匹配,因此第262行多1列就直接触发错误。
解决办法
直接修复CSV文件
定位到第262行,检查是否误加了逗号,或者某个含逗号的字段未用引号包裹(比如"New York, USA"格式才不会被分割为两列),修正后重新运行命令。预处理过滤问题行
在read.csv.sql中添加filter参数,用awk提前筛选出列数正确的行(假设表头为37列):reduced = read.csv.sql(file.choose(), sql = 'select * from file where "country" = "Poland" OR country = "Germany" OR country = "France" OR country = "Spain"', header = TRUE, eol = "\n", filter = "awk -F ',' 'NF==37'")指定正确的引号参数
如果是字段内的逗号未被正确识别导致列数错误,可明确指定quote参数,确保带引号的字段不被错误分割:reduced = read.csv.sql(file.choose(), sql = 'select * from file where "country" = "Poland" OR country = "Germany" OR country = "France" OR country = "Spain"', header = TRUE, eol = "\n", quote = '"')
内容的提问来源于stack exchange,提问作者Federico
相关产品推荐
相关产品推荐

