使用csv - SQLite vs join

时间:2009-09-07 15:31:40

标签: sqlite shell

我在我们公司有一个旧项目,它使用shell脚本很多。最流行的命令是:grep,sed,sort。现在还可以。但有一件事让我感到困扰。有时我们有来自其他公司的输入数据,这些数据采用类似csv的格式。这些输入文件由几个ID连接,就像它们只是某些DBMS的转储一样。

不是将数据导入某个DBMS,而是有一些shell脚本页面可以“切割”,“粘贴”和“连接”组合排序以模拟真实数据库。

最好的解决方案似乎是使用SQLite,但我担心的是它可以处理的数据大小和工作速度。似乎SQLite会使使用shell的这些功能变得更加困难,因为'sed'。

有人可以建议或描述您的成功故事吗?

5 个答案:

答案 0 :(得分:4)

  • 大小:根据docs
  • ,SQLite可以使用巨大的数据集,轻松进入太字节数据集
  • 速度:符合索引的查询和联接在O(logn)或O(nlogn)上,而不是从sedcut得到的O(n)或O(n ^ 2) ,pastejoin
  • sed
    • 如果你用它来简单地转换一个字段,就可以很容易地在Python上做一个或两个内容来处理它。
    • 如果您使用它来转换表结构,那么这是一个完全不同的任务,可以通过ALTER TABLE轻松解决,也可以是一个巨大的处理项目。

答案 1 :(得分:2)

Sqlite3是一个合理的计划

只要在同一台机器上运行脚本和数据库,

Sqlite3就可以正常工作。如果你想在网络上工作,为什么不运行mysql?

Ruby,Python和Perl之类的东西可用作脚本语言,并且可以与所有其他shell命令很好地互操作。虽然理论上SQL可以直接使用,但你不应该尝试它,你需要通过已经有sqlite3集成的脚本语言来访问数据库。

您使用脚本语言很像awk,sed或sh脚本。例如,以下是一些用于创建sqlite3 db的Ruby命令:

require 'rubygems'
require 'sqlite3'    
# ... stuff removed here ...
db = SQLite3::Database.new(aDatabase)
db.execute("drop table if exists " + aTable);
File.open(aFile, "r") do |f|
  @sql = SqlParams.new(f.gets)
  sqlCreateStmt = "CREATE TABLE #{aTable} (
      Id INTEGER PRIMARY KEY,
      #{@sql.sqlCols}
      )\n"
  placeholders = ("?," * @sql.n).chomp(",");
  sqlInsertStmt = "INSERT INTO #{aTable} VALUES (NULL, #{placeholders})"
  puts @sql.n, ": ", sqlCreateStmt, ": ", placeholders, ": ",sqlInsertStmt
  db.execute(sqlCreateStmt)
  db.transaction do |d|
    f.each_line do |el|
      t = el.split("\t", @sql.n)
      print '.'
      d.execute(sqlInsertStmt, t)
    end
  end
end
db.close() unless db.closed?
print "\n"

答案 2 :(得分:1)

如果shell脚本对你有用,那么我认为没有理由放弃它们(这是来自一个大数据库人)。即使您确实获得了数据库,您仍然希望这些脚本执行导入/导出和其他操作。我做的是确保你的“剪切”,“粘贴”和“加入”逻辑被抽象掉,这样加入两组csv数据是一个简单的操作依赖于“黑匣子” “代码,而不是为每个新操作重新编码连接逻辑。

答案 3 :(得分:0)

使用具有索引的任何数据库系统将比解析文本文件更快。例如,如果您有100.000条记录,则二进制索引列可以在17次读取中提取任何“记录”。在这样的平面文件中查找记录可以从1到100,000次读取。

索引对于速度和快速访问最重要,但对于数据库,您还可以获得其他好处,例如数据一致性(确保所有数据都具有有效类型)。

答案 4 :(得分:0)

我最近在一个项目上使用过Sqlite。 Sqlite文件是+600 MB,它对我来说足够快。您可以使用索引来提高速度。您可以测试索引是否与EXPLAIN QUERY PLAN(http://www.sqlite.org/lang_explain.html

一起使用

与csv解析相比,使用SQL进行查询将使您的生活更轻松。

如果你需要将sqlite与脚本结合起来,我建议使用Python。 Python内置了sqlitecsv file handling的库。因此,开始工作和组合两者非常容易(例如,编写一个简单的脚本,为您的其他现有命令行工具输出数据)。