JQuick-SQL CSV 文件数据接入:转换为内存表后再查询

JQuick-SQL CSV 文件数据接入:转换为内存表后再查询

Meta 描述:学习将 CSV 在应用层或 jquick-connector 中解析为 JQuickRow/JQuickDataSet,再通过 registerTable 交给 jquick-sql 执行 SQL 分析。

标签:jquick-sql、CSV 文件、JQuickDataSet、异构数据源联邦查询、轻量级 SQL 引擎、Java 跨库查询、文件数据分析

官网示例:

前言

CSV 常用于财务导出、门店日报和第三方批量交换。jquick-sql 可查询已经注册的 CSV 结果集,但它本身不提供 CSV 文件读取或解析 API。推荐由应用层或 jquick-connector 完成文件读取、表头校验、编码处理和类型映射,再将记录注册到引擎。

CSV 接入的标准流程

流程可概括为:定位文件、使用应用选定的 CSV 解析库读取、校验必填列、转换日期和数值、生成 JQuickRow、定义 JQuickColumnMeta、调用 registerTable。最后由 jquick-sql 使用 SQL 处理分组、筛选和关联。

将文件解析职责留在应用层,可根据企业现有规范处理 UTF-8、GBK、引号转义、异常行和数据血缘;这些都不是 jquick-sql 的原生连接器功能。

字段类型与数据质量

CSV 中的值天然是文本,必须在转换阶段明确类型。金额建议使用团队既定的精度策略,日期应统一格式,业务编码应避免被解析为数字后丢失前导零。空字符串与 null 的业务含义也要预先约定。

对于不可信文件,可先记录行号、错误原因和丢弃策略。只有通过校验的数据再注册,能让 SQL 查询结果更可审计。

与业务库数据关联

文件数据可注册为 csv_sales,业务库数据经应用层读取后注册为 products 或 stores,然后在 jquick-sql 中 JOIN。这里的异构数据源联邦查询是对两张已注册内存表的统一计算,不是引擎直接打开 CSV 或连接数据库。

控制注册数据规模尤其重要:按日期、区域或批次切片通常比一次性加载全部历史文件更稳妥。

代码案例

java 复制代码
import com.github.paohaijiao.engine.JQuickSQL;
import com.github.paohaijiao.statement.JQuickColumnMeta;
import com.github.paohaijiao.statement.JQuickDataSet;
import com.github.paohaijiao.statement.JQuickRow;
import java.util.Arrays;
import java.util.List;

public class CsvDataSourceDemo {
    public static void main(String[] args) {
        // csvRows 应由应用层或 jquick-connector 解析 CSV 后构造;
        // jquick-sql 不直接提供 CSV 读取 API。
        List<JQuickRow> csvRows = Arrays.asList(
            row("store_code", "S001", "amount", 120.5),
            row("store_code", "S002", "amount", 95.0),
            row("store_code", "S001", "amount", 80.0)
        );

        JQuickSQL sql = JQuickSQL.embedded();
        try {
            sql.registerTable("csv_sales", Arrays.asList(
                new JQuickColumnMeta("store_code", String.class, "csv_sales"),
                new JQuickColumnMeta("amount", Double.class, "csv_sales")
            ), csvRows);

            JQuickDataSet result = sql.execute(
                "SELECT store_code, SUM(amount) AS total_amount " +
                "FROM csv_sales GROUP BY store_code ORDER BY total_amount DESC"
            );
            result.printTable();
        } finally {
            sql.shutdown();
        }
    }

    private static JQuickRow row(Object... values) {
        JQuickRow row = new JQuickRow();
        for (int i = 0; i < values.length; i += 2) row.put((String) values[i], values[i + 1]);
        return row;
    }
}

常见问题

**jquick-sql 能直接传入 CSV 路径吗?**不能。请先在应用层或 jquick-connector 读取并转换为 JQuickRow / JQuickDataSet。

**CSV 金额为什么不能一直用 String?**字符串会影响聚合和比较语义,应在接入层映射为适当的数值类型。

**能把多个 CSV 文件合并分析吗?**可以。分别解析后注册为表,或先在应用层统一为一个数据集。

总结与拓展

CSV 场景的价值在于快速承接离线业务数据。应用层负责文件质量和类型标准化,jquick-sql 负责 SQL 分析,这种分工能帮助中小企业以较轻的方式建立文件与业务数据之间的查询能力。

Core Advantage

Turns validated file rows into a consistent in-memory SQL surface without inventing a file connector.

Applicable Scenarios

Daily exports, financial reconciliation files, store reports, third-party batch data, and temporary data analysis.

相关推荐
星恒随风5 小时前
MySQL 从零入门(五):MySQL 内置函数详解——日期、字符串、数学函数与实战案例
linux·数据库·笔记·sql·mysql
吴名氏.7 小时前
Java转AI Agent教程(第十三周)混合检索与重排
java·数据库·人工智能·ai·ai agent
爱码少年7 小时前
Springboot下如何将CSV文件数据导入H2、Mysql数据库表
数据库·mysql·csv
2603_969694858 小时前
【JavaWeb学习记录】MyBatis核心知识点与实战笔记:从入门到动态SQL
笔记·sql·学习·mysql·mybatis·javaweb·学习方法
可乐ea8 小时前
智能体记忆该拆成几层:笔记、记忆表示与注入上下文
服务器·数据库·笔记·ai智能体·提示词工程·上下文工程·记忆系统
数据技术说9 小时前
在 KES AI 数据库上搭一条 NL2SQL 链路:语义、召回、权限各放哪
人工智能·sql·代码规范
阿义有问题10 小时前
MySQL 迁移达梦全流程实战:DTS 七步图解 + 对象名全大写适配(附踩坑清单)
数据库
猫猫不是喵喵.12 小时前
从0到1创建一个微服务项目
java·数据库·微服务·1024程序员节
lsc_blog13 小时前
听到优化风声,先准备能由自己掌控的事
数据库·分布式·中间件·职场和发展·重构
墨痕诉清风13 小时前
SSRF漏洞实战记录+OSS桶命令执行+MCP漏洞
linux·服务器·数据库