如何用R的read.csv.sql读取含单元格内逗号分隔值的大CSV文件
解决CSV多值列导致的列数不匹配问题(用read.csv.sql处理大文件)
针对你10GB的CSV文件,且第二列colours包含多个逗号分隔值的情况,可以通过在SQL层面拆分字符串的方式,不用修改原文件就能正确读取三列数据,同时保留筛选功能。
核心思路
你的CSV每行结构固定:clothes, [多个逗号分隔的颜色], size,也就是每行的第一个逗号分隔出clothes,最后一个逗号分隔出size,中间所有内容都是colours列的值。利用SQLite的字符串函数,直接在读取时拆分出这三部分。
具体代码
library(sqldf) # 读取大文件并处理列拆分 df <- read.csv.sql( "你的文件路径.csv", sql = " SELECT -- 提取第一列clothes:第一个逗号前的内容 SUBSTR(line, 1, INSTR(line, ',') - 1) AS clothes, -- 提取第二列colours:第一个逗号后到最后一个逗号前的内容 SUBSTR( line, INSTR(line, ',') + 1, LENGTH(line) - INSTR(line, ',') - INSTR(REVERSE(line), ',') ) AS colours, -- 提取第三列size:最后一个逗号后的内容 SUBSTR(line, LENGTH(line) - INSTR(REVERSE(line), ',') + 2) AS size FROM file -- 这里可以加你的筛选条件,比如筛选clothes为shirt的行 WHERE SUBSTR(line, 1, INSTR(line, ',') - 1) = 'shirt' ", sep = "\0" # 设置一个不存在的分隔符,让每行作为单个字符串读取 )
代码解释
sep = "\0":把整个行作为一个名为line的字符串列读取,避免默认逗号拆分导致列数混乱。- 提取clothes:用
INSTR(line, ',')找到第一个逗号的位置,截取该位置之前的内容。 - 提取size:先用
REVERSE(line)反转字符串,找到反转后第一个逗号的位置(对应原字符串最后一个逗号的位置),再截取原字符串中该位置之后的内容。 - 提取colours:用总行长度减去第一个逗号和最后一个逗号的位置,得到中间部分的长度,截取这部分内容。
- 筛选条件:直接在
WHERE子句里对拆分后的clothes(或其他列)做筛选,和你之前的需求兼容。
注意事项
- 先拿小样本测试代码是否正确,再处理10GB的大文件,避免浪费时间。
- 如果你的CSV有表头,需要跳过第一行,可以在
sql语句里加WHERE rowid > 1(因为read.csv.sql会把表头也作为一行读取,rowid从1开始)。
内容的提问来源于stack exchange,提问作者wwandw
相关产品推荐
相关产品推荐

