0

我需要编写一些脚本来在我的服务器上执行一些任务(运行 Ubuntu 服务器 8.04 TLS)。这些任务将定期运行,因此我将脚本作为 cron 作业运行。

我将任务分为“A 组”和“B 组”——因为(至少在我看来)它们有点不同。

任务组 A

  1. 从文件中导入数据并可能重新格式化它 - 通过重新格式化,我的意思是做一些事情,比如对数据进行清理,可能对其进行规范化,或者对数据的“列”进行计算

  2. 将整理好的数据导入数据库。目前,我主要使用 mySQL 进行绝大多数导入——尽管一些文件将被导入 sqlLite 数据库。

注意:这些文件将主要是文本文件,尽管其中一些文件是二进制格式(我自己的专有格式,由我开发的 C++ 应用程序编写)。

任务组 B

  1. 从数据库中提取数据
  2. 对数据执行计算并在数据库中插入或更新表。

我的编码经验主要是作为 C/C++ 开发人员,尽管在过去 2 年左右的时间里我也一直在使用 PHP(+ 一些与此问题无关的其他语言)。我来自 Windows 背景,所以我仍然在 Linux 环境中找到自己的立足点。

我的问题是——我需要编写脚本来执行我上面描述的任务。虽然我想我可以编写一些 C++ 应用程序用于 shell 脚本,但我认为用脚本语言编写它们可能会更好,但这可能是一个有缺陷的假设。我的想法是在脚本中修改内容会更容易——无需重建等来更改功能。此外,与 Perl、Python 等“自然”脚本语言相比,C++ 中的 C++ 数据处理往往​​涉及更多的代码行。

假设这里的大多数人都同意脚本是要走的路,这就是我的困境。我使用哪种脚本语言来执行上述任务(给出我的背景)?

我的直觉告诉我 Perl ( shudder ) 将是执行上述所有任务的最明显的选择。但是(这是一个很大的但是)。仅仅提到 Perl 就让我的脚趾发麻,因为前段时间我对它有过非常非常糟糕的体验(多年前买了 Perl Camel 书 + 'data munging with Perl',但仍然无法“理解”它感觉太陌生了。语法对我来说似乎很不自然-尽管我尝试学习了多少次-所以如果可能的话,我真的很想错过它。PHP(我已经知道),也不确定是在 CLI 上编写脚本的好人选(我没有看到很多关于如何执行此操作的示例等 - 所以我可能错了)。

我必须提到的最后一件事是,如果我必须学习一门新语言才能做到这一点,我不能(时间限制)花费超过一天的时间来学习这样做所需的关键命令/功能(一旦我实际部署了脚本,我总是可以在以后学习语言的细节)。

那么,您会推荐哪种脚本语言(PHP、Python、Perl,[在此处插入您最喜欢的])——最重要的是为什么?或者,我应该坚持编写在 shell 脚本中调用的小型 C++ 应用程序吗?

最后,如果你建议了一种脚本语言,你能用几行来说明吗(Perl mongers - 我在看你的方向[没什么太神秘的!])我如何使用你建议的语言来做我正在尝试的事情做即

  • 将 CSV 文件加载到某种数据结构中,您可以在其中轻松访问数据列以进行数据操作
  • 将列式数据转储到 mySQL 表中
  • 将 mySQL 表中的数据加载到允许以脚本语言访问列/行的数据结构中

希望这些片段能让我快速找出对我来说学习曲线最陡峭的语言——以及那些简单、优雅和高效的语言(希望这两个标准 [优雅和浅学习曲线] 不是正交的——尽管我怀疑他们可能是)。

4

3 回答 3

4

好吧,几年前我还是你。根本不喜欢 Perl,并且会将我的同龄人用 Perl 编写的任何脚本重写回 Python——因为我无法忍受 Perl。长话短说——假设我现在对 Perl 相当熟悉。我会推荐一本名为“Impatient Perl”的书,它很好地解释了真正重要的东西,并将我转化为 Perl。:) 另一件事是在您的计算机上安装 Perl 文档 - 这对我来说非常重要 - 轻松快速地访问示例代码等。

任务 A 的 Teaser 脚本 - 读取文件,对其进行格式化,然后写入数据库。

use autodie qw(:all);
use Text::CSV_XS ();
use DBI ();

my $csv = Text::CSV_XS->new({binary => 1}) 
  or die 'Cannot use CSV: ' . Text::CSV->error_diag;

{
    my $database_handle = DBI->connect(
        'dbi:SQLite:dbname=some_database_file.sqlite', undef, undef, {
            RaiseError => 1,
            AutoCommit => 1,
        },
    );
    $database_handle->do(
        q{CREATE TABLE something_table_or_other ('foo' CHAR(10), 'bar' CHAR(10), 'baz' CHAR(10), 'quux' CHAR(10), 'blah' CHAR(10))}
    );

    my $statement_handle = $database_handle->prepare(
        q{INSERT INTO something_table_or_other ('foo', 'bar', 'baz', 'quux', 'blah') VALUES (?, ?, ?, ?, ?)}
    );

    {
        open my $file_handle, '<:encoding(utf8)', 'data.csv';
        while (my $columns_aref = $csv->getline($file_handle)) {
            my @columns = @{ $columns_aref };

            # sanitize the columns - maybe substitute commas, numbers, etc.
            for (@columns) {
                s{,}{};  # substitutes commas with nothing
            }

            # insert columns into database now, using placeholders
            $statement_handle->execute(@columns);
        }
    }
}

注意:鉴于您目前对 Perl 的厌恶,我强烈建议您使用任何您熟悉的编程语言来完成上述“任务”。以上只是试图向您展示它可能并不那么神秘。当您不想重复自己时,您会变得神秘!:)

于 2010-05-14T12:59:25.513 回答
3

从文件中导入数据并可能重新格式化

Python 擅长于此。请务必阅读该csv模块,这样您就不会浪费时间自己发明它。

对于二进制数据,您可能必须使用该struct模块。[如果您编写了生成二进制数据的 C++ 程序,请考虑重写该程序以停止使用二进制数据。从长远来看,你的生活会更简单。磁盘存储比您的时间便宜;高度压缩的二进制格式成本高于价值。]

将整理好的数据导入数据库。从数据库中提取数据 对数据执行计算并在数据库中插入或更新表。

使用mysqldbMySQL 的模块。SQLite 是 Python 内置的。

通常,您会希望使用对象-关系映射而不是编写自己的 SQL。看看sqlobject这个sqlalchemy

另外,在做太多这件事之前,买一本关于数据仓库的好书。您的两个“任务组”听起来像是您正在开始数据仓库之路。糟糕的数据库设计很容易把这一切搞砸。在您做任何其他事情之前了解什么是“星型模式”。

于 2010-05-14T10:55:56.300 回答
1

我会选择 Python 或 Ruby。您很可能会发现它们Perl 更快/更容易上手,而且它们本身仍然是非常强大/高效的“数据处理”语言。您应该能够在一天或更短的时间内掌握其中的任何一个,而不是经常查找随机库函数。

快速学习 Python:http: //diveintopython3.ep.io/

我个人不能自己推荐一个 Ruby 教程,但我相信其他人可以提供不错的选择。

如果您想使用其中任何一个,http://www.trypython.orghttp://www.tryruby.org都为各自的语言提供在线交互式 shell 版本的解释器。

于 2010-05-14T10:15:14.110 回答