我在我们公司有一个旧项目,它使用shell脚本很多。最流行的命令是:grep,sed,sort。现在还可以。但有一件事让我感到困扰。有时我们有来自其他公司的输入数据,这些数据采用类似csv的格式。这些输入文件由几个ID连接,就像它们只是某些DBMS的转储一样。
不是将数据导入某个DBMS,而是有一些shell脚本页面可以“切割”,“粘贴”和“连接”组合排序以模拟真实数据库。
最好的解决方案似乎是使用SQLite,但我担心的是它可以处理的数据大小和工作速度。似乎SQLite会使使用shell的这些功能变得更加困难,因为'sed'。
有人可以建议或描述您的成功故事吗?
答案 0 :(得分:4)
sed
,cut
得到的O(n)或O(n ^ 2) ,paste
和join
。sed
:
ALTER TABLE
轻松解决,也可以是一个巨大的处理项目。答案 1 :(得分:2)
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内置了sqlite和csv file handling的库。因此,开始工作和组合两者非常容易(例如,编写一个简单的脚本,为您的其他现有命令行工具输出数据)。