一个基于sql的数据处理工具, 可以通过写sql的方式对excel, csv, 跨库mysql表等进行数据处理和加工.
欢迎反馈问题, 提出建议, 甚至是直接贡献代码 (参与进来, 这是最好的方式. :D).
从 releases 里面下载最新的zip包, 解压到一个特定目录.
运行需要java 1.8版本以上运行时环境, 请使用下面命令来检查你是否已经安装java运行时环境并且版本是1.8以上:
java --version
准备一个测试的sql文件, 内容为:
# h2
select 1 as a;
从命令行进入目录, 执行下面命令:
./start.sh /你的sql文件路径/文件名称.sql
如果是windows命令行的话, 则是:
start.bat C:\你的sql文件路径\文件名称.sql
正常执行的话, 显示结果类似这样:
~/xxxx$ ./start.sh /Users/xxx/test.sql
执行: /Users/xxx/test.sql
==============================
SQL: h2
select 1 as a;
结果集: table, 行数: 1, 耗时: 149毫秒
==============================
导出结果集table
导出文件路径为: /Users/xxx/SqlDataProcessor/./output/./table.csv
正常情况下结果文件会自动打开的. 如果没有自动打开的话, 可以手动进入output目录, 然后双击里面的csv文件看是不是没有设置默认打开方式. 设置好默认打开方式后, 后续再执行就会自动打开了.
通过在一个sql文件中写多个导入语句和多个sql语句, 以实现数据的流式处理:
- 表格文件处理/计算/合并
- mysql跨实例数据查询/导出/迁移
- 表格数据导入并迁移到mysql数据库
在当前目录下, 文件名称为: databases.json
. 首次运行时会自动生成这个文件的默认内容, 默认自带一个 h2 内存数据库, 名称为 h2
, 可以做简单的测试和使用. 推荐自己配置一个mysql数据库使用.
文件后缀建议为sql, 以让你的文本编辑器支持sql语法的高亮显示.
# import /Users/xxx/Downloads/xxx.xlsx
如果想指定导入具体的一个sheet, 可以这样:
# import /Users/xxx/Downloads/xxx.xlsx[sheet名称1]
示例1
# h2
select * from test_table1 temp;
示例2: 多个sql一把执行
# local_mysql
set @input = 'hello';
update test_table set a = 2 where a = 1;
select
temp.name,
temp2.text
from test_table temp
left join test_table2 temp2 on temp2.id = temp.temp2_id
where
text = @input
order by temp.id desc
limit 10
;
# import /Users/xxx/Downloads/xxx.xlsx as $table1
# local_mysql as $table2
select
temp.name
from test_table temp;
注意: 一定要在结果集后面加一个自己的自定义名称, 结果集是以一个子查询(或临时表)的方式运行的, sql标准要求子查询一定要指定一个别名.
# import /Users/xxx/Downloads/xxx.xlsx
# h2 as $table2
select
id
text
from test_table2
;
# local_mysql
select
temp.name,
temp2.text,
temp3.label
from $table temp
left join $table2 temp2 on temp2.id = temp.id2
left join test_table3 temp3 on temp3.id = temp.id2
;
# local_mysql
select * from $table temp;
默认情况下, 最后一个执行的结果集会被自动导出和打开. export
这个命令主要用途是用来在一个sql文件的运行阶段导出各个不同的结果集, 或者想自己指定结果文件的名称, 路径或格式.
-- 使用默认路径和文件名
# export
-- 指定导出文件的名称
# export 这是一个文件名
-- 使用指定的完整路径
# export /Users/wenchaozeng/Downloads/aa.csv
如果指定了一个文件的后缀, 比如.csv
或.xlsx
, 则会自动切换到对应的文件格式做导出.
当使用 #
来注释时, 后面的文字不能是这个工具的关键词, 比如 export
, import
, end
, 或者是一个存在的数据库名.
-- 这是注释
## 这是注释
# local_db
select
temp.name
## 这是注释
from test_table temp
;
# import /Users/xxx/Downloads/xxx.xlsx
# end
-- 从这里开始以下的sql都不会被运行了
# local_db as $table2
select
id
text
from test_table2
;
默认情况下, null值会在导出时候显示成空字符串. 可以使用# exportnulls
来指定在导出文件的时候, null值被导出为<null>
, 这样可以看出来具体哪个是null值, 与空字符串作区分. 可以使用# -exportnulls
来恢复默认行为, 即null值被导出为空白, 和空字符串显示一样.
使用# exportxlsx
设置xlsx导出格式, 使用# -exportxlsx
关闭xlsx导出格式(即导出格式为csv). 默认: 导出格式为csv.
如果在# export
命令里指定了一个文件后缀, 比如.csv
或.xlsx
, 则会自动切换到对应的导出格式.
默认情况下, 如果一个sql里引用了结果集, 结果集会以子查询的方式嵌入到sql中. 如果结果集数据量很大, 会导致子查询的sql很大, 从而导致超出java里String的最大容量, 或者超出mysql数据库可接收的最大sql长度.
使用临时表模式, 则会预先把结果集的数据分批导入到临时表中, 然后sql会直接从临时表查询结果集, 这样sql就比较短.
使用# temptables
打开临时表模式, 使用# -temptables
关闭临时表模式. 默认: 关闭临时表模式.