textql (using csv as database)

王强

textql 使用

向操作数据库一样操作csv

有时候需要操作csv文件,进行整合处理,或者多个csv的数据想要合并的话,之前都是用的excel,处理起来的话不太方便,那时候就想如果代码可以高的话多好啊,现在变成了现实,开源的textql这个工具可以实现这个需求

git

https://github.com/dinedal/textql

安装

  • mac
brew install textql  
  • 其他环境

配置go的环境,下载源代码,根据操作系统类型编译可执行文件

go get -u github.com/dinedal/textql/...  
 CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o balancelog_sync_win.exe main.go   
 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o balancelog_sync_linux main.go   

常用命令

Usage of textql:

  textql [-console] [-save-to path path] [-output-file path] [-output-dlm delimter] [-output-header] [-header] [-dlm delimter] [-source path] [-sql sql_statements] [-quiet] [path ...]

  -console
        After all statements are run, open SQLite3 REPL with this data
  -dlm string // 如果打开的csv文件不是,隔开的
        Input delimiter character between fields -dlm=tab for tab, -dlm=0x## to specify a character code in hex (default ",")
  -header  //读取csv对应的列,如果要查询对应的列的话需要加上这个参数
        Treat input files as having the first row as a header row
  -output-dlm string  // 文件保存的时候,分割方式
        Output delimiter character between fields -output-dlm=tab for tab, -dlm=0x## to specify a character code in hex (default ",")
  -output-file string  // 保存文件
        Filename to write output to, if empty no output is written (default "stdout")
  -output-header  // 在查询到的时候需要展示对应header中的列信息
        Display column names in output
  -quiet
        Surpress logging
  -save-to string  // 保存为sqlite数据库文件
        SQLite3 db is left on disk at this file
  -sql string // 后面要执行的sql语句
        SQL Statement(s) to run on the data
  -version
        Print version and exit

实践demo

基本查询

在查询的时候可以简化操作,比如 select * from table 直接为 * , select name from rider order by instm limit 1 直接为name order by instm limit 1;

// show the header
textql  -output-header -header -sql "name order by ins_tm limit 1" rider.csv

textql  -output-header -header -sql "select id from rider order by ins_tm limit 1" rider.csv  
textql  -output-header -header -sql "id order by ins_tm limit 1" rider.csv


textql -header -sql "select id from balance_log order by withdraw_tm desc limit 1" balance_log.csv  
textql -header -sql "id order by withdraw_tm desc limit 1" balance_log.csv

聚合操作

textql -header -sql "round(sum(cost))" balance_log.csv  
textql -header -sql "max(cost)" balance_log.csv  

常用的函数

多个csv关联

同sql的关联预发一样,并没有什么区别,也可以使用简化操作

// table join
textql -output-header  -header -sql "rider.id,rider.name, balance_log.cost from balance_log  join rider on balance_log.rider_id=rider.id order by cost desc limit 10" balance_log.csv rider.csv 

查询结果导出

进行查询后,需要将结果保存到新的csv文件或者sqlite3数据库
  • 保存到csv
    // result save to csv
textql -output-header -output-file=balance_rider.csv  -header -sql "rider.id,rider.name, balance_log.cost from balance_log  join rider on balance_log.rider_id=rider.id order by cost desc limit 10" balance_log.csv rider.csv  
  • 操作sqlite3

    可以直接将结果,保存为sqlite3数据库

    貌似不支持将join直接的结果保存为db,保存后数据库查了,居然是两个表,而且是全量数据,忽略吧,反正你用sqlite3的机会不不多,实在不行就先保存为csv,然后在保存为db呗

textql -save-to=balance_rider.db  -header -sql "*" balance_rider.csv

// read sqlite3db
sqlite3 balance_rider.db "select * from balance_rider"