使用 Sprog 进行数据操作

作者:Mike Diehl

我不认为我认识有人喜欢数据操作这项任务,我当然也不例外。一些更复杂的操作带来短暂的满足感,因为它们是技术挑战,但最终,数据操作是很枯燥的。有时,我能够将数据集导入到 OpenOffice 的电子表格中,但通常,我必须编写 Perl 脚本或 Bash 脚本来完成需要做的事情。通常,程序并不难,而且我通常会储备一些代码片段来处理常见的任务。即便如此,它就是...不好玩。

几年前,我偶然发现了 Sprog;当时我正在寻找完全不相关的东西,但由于互联网的奇妙之处,我注意到了 Sprog 程序并对其进行了进一步的调查。

Sprog 允许您通过拖拽和连接各种齿轮来构建“机器”以解决数据操作问题。Sprog 提供了用于读取文件、获取和解析网页、处理 CSV 文件、运行小型 Perl 代码片段以及最终显示或写入结果的齿轮。

Sprog 确实有一些软件要求

GTK+ 库
libgnomecanvas*
libglade
Perl - 最好是 5.8 版本,以及以下 CPAN 模块
Gtk2 Perl 绑定
Gnome2::Canvas*
Gtk2::GladeXML
YAML
Pod::Simple

一旦满足这些条件,安装 Sprog 就如同

perl Makefile.PL
make install

最后,您可以使用 sprog 命令启动程序。Sprog 会向您展示一个空白的机器画布。


图 1。

正如您所看到的,这里有各种各样的齿轮可用,您只需将它们拖到画布上,配置它们,然后按顺序连接它们。每个齿轮都有一个输入选项卡和一个输出选项卡,视情况而定。每个选项卡都经过键控,因此您无法以不合理的方式将齿轮连接在一起。例如,您不能将“检索 URL”齿轮连接到“添加字段名称”齿轮;这些齿轮根本“不匹配”,结果也不会有意义。我已经在图 2 中开始构建一个简单的机器。


图 2。


图 3。

通过右键单击并为每个齿轮选择“属性”,我可以告诉机器要打开哪个文件以及要查找哪个模式。一旦所有齿轮都连接好,如图 3 所示,机器将读取文件,查找文件中与我提供的模式匹配的所有行,将该行转换为大写,并在文本窗口中显示结果。

正如您所看到的,齿轮像拼图一样拼合在一起。一台机器从输入齿轮开始,例如“读取文件”齿轮或“检索 URL”齿轮。从那里,数据流入机器中的下一个齿轮。每个齿轮对其输入执行特定的功能,并将结果传递给下一个齿轮。最后,数据到达机器的输出齿轮。Sprog 具有输出齿轮,用于在文本窗口中显示结果、写入数据文件或将结果通过管道传输到命令。

让我们考虑另一个相当简单的例子。在图 4 中,我创建了一个机器,它获取 `ls -la` 命令的输出,并以制表符分隔的格式打印出来,只包含文件名和权限字段。当然,这是一个简单的任务,但它让我们讨论 Sprog 机器的各种功能。


图 4。

我配置了“运行命令”齿轮来运行 “ls -la” 命令。第一个“Perl 代码”齿轮只包含这段 Perl 代码

s/\ +/,/g;

这段代码从默认的 ($_) 变量中获取输入,并将一组或多个空格更改为单个逗号,并输出 CSV 数据流。

“CSV 分割”齿轮接受该数据流并将其分割出来,供“选择列”齿轮使用。“选择列”齿轮被配置为选择第 1 列和第 9 列,并将结果发送到下一个齿轮。

“列表到 CSV”齿轮转换输入,供“Perl 代码”使用,该代码仅将逗号转换为制表符。

最后,结果显示在文本窗口中。

现在当然,我可以编写 Perl 代码并在不到一分钟的时间内完成它。但是,不了解 Perl 或者不想学习 Perl 的人将能够将这些齿轮和其他齿轮组装成一台机器,以他们能够理解的方式完成给定的数据操作目标。实际上,期望能够存储整个齿轮库,并将其留给其他人组装以完成给定的任务,这并非不合理。例如,可以考虑构建一个齿轮,用于从给定的服务器收集 Apache 日志文件。然后可以创建一个齿轮,该齿轮使用 Perl 例程将每个日志条目解析为 CSV
格式。从那里,一个人可以组装一台机器,以几乎任何他们想要的格式输出报告。

拥有旨在解决常见问题的现成齿轮的概念意味着我们可以捕获这些齿轮并重复使用它们。Sprog 允许我们保存给定的机器,当然,它也允许我们保存完全不相关的齿轮,并基本上构建一个“拼图”库,以解决各种问题。最终用户只需组装解决给定问题所需的部分。为了使这个概念更清晰,让我们看看已保存的机器文件的内容。

- Sprog
- 1
- run_on_drop: 0
-
- CLASS: Sprog::Gear::CommandIn
ID: 6
NEXT: 14
X: 334
Y: 173
prop
command: 'ls -la '
title: Run Command
- CLASS: Sprog::Gear::CSVSplit
ID: 11
NEXT: 12
X: 334
Y: 253
prop
title: CSV Split
- CLASS: Sprog::Gear::TextWindow
ID: 7
NEXT: ~
X: 334
Y: 413
prop
auto_scroll: ''
clear_on_run: 1
show_end_events: ''
show_start_events: ''
title: Text Window
- CLASS: Sprog::Gear::SelectColumns
ID: 12
NEXT: 10
X: 334
Y: 293
prop
base: 1
columns: '1,9'
title: Select Columns
- CLASS: Sprog::Gear::PerlCode
ID: 14
NEXT: 11
X: 334
Y: 213
prop
perl_code: 's/\ +/,/g;'
title: Perl Code
- CLASS: Sprog::Gear::PerlCode
ID: 16
NEXT: 7
X: 334
Y: 373
prop
perl_code: 's/,/\t/g;'
title: Perl Code
- CLASS: Sprog::Gear::ListToCSV
ID: 10
NEXT: 16
X: 334
Y: 333
prop
title: List to CSV

幸运的是,文件格式是 ASCII,并且相当直观。本质上,它定义了 7 个齿轮,并为它们提供了唯一的 ID 号。例如,如果您查看 ID 为 14 的齿轮,您会看到它是一个“Perl 代码”齿轮,并且它对其输入执行 's/\ +/,/g;'。齿轮的标题是“Perl 代码”,但我相信我们可以想出更具想象力的东西,也许是“剥离
所有空格并将它们转换为逗号”。更改齿轮的名称就像更改已保存的机器文件中的标题一样容易。序列中的下一个齿轮是齿轮 11。因此,继续我们上面的想法,我们可以创建一个已保存齿轮的库,然后修改保存文件,以便每个齿轮都得到很好的描述。最后,我们可以将库加载到 Sprog 中并组装
机器来完成我们需要做的任何数据操作。

一旦创建了齿轮库,我们就可以将它们分发给其他人,让他们组装起来以解决重复出现的问题。创建其他人可以使用来解决业务问题而无需了解它们如何工作的工具,这真是太好了。另一方面,我不想重写相同的代码片段来解决常见问题。在我看来,每个人都是赢家!

我可以轻松地想象创建访问 SQL 数据库或 Apache 日志文件的 Sprog 齿轮。我可以想象将 Perl 的过滤功能合并到一个旨在分析 Apache 日志文件或电子邮件日志文件的齿轮中。我甚至可以看到创建一个齿轮以本机 Excel 格式输出电子表格。

在使用 Sprog 一段时间后,我想出了一些提示,可以使您更轻松地使用它。虽然 Sprog 确实实现了捕捉功能,但似乎更容易抓住给定的齿轮的“齿轮”图标,并将其与前一个齿轮稍微重叠;您会看到它卡入到位。否则,通常很难让齿轮相互连接。此外,似乎 Sprog 对解决问题施加了严格的自上而下的方法。Sprog 中没有
分支。Sprog 实现了一系列齿轮,而不是变速器。最后,我发现如果我对给定的齿轮进行更改,我需要将其重新连接到它之前的齿轮。我想这很有道理,但这导致了很多最初的挫败感,直到我意识到发生了什么。

我不确定我认为 Sprog 比简单地编写 Perl 脚本来执行特定的数据操作任务更容易,但它肯定更有趣,并且可以将它委托给数据及其结果的实际消费者,从而使他们能够满足自己的数据操作需求。不是每个人都会编写 Perl,而 Sprog 是一种使人们能够以透明且可重复的方式操作数据的好方法。

加载 Disqus 评论