【问题标题】:Data munging and data import scripting [closed]数据处理和数据导入脚本[关闭]
【发布时间】:2011-02-19 11:18:19
【问题描述】:

我需要编写一些脚本来在我的服务器上执行一些任务(运行 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 贩子 - 我正在寻找您的方向 [没什么太神秘的!])我可以如何使用您建议的语言来做什么我正在尝试做ie

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

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

【问题讨论】:

  • “我不能(时间限制)花费超过一天的时间来学习执行此操作所需的关键命令/功能” == 行动迅速,闲暇时悔改。始终是一个好政策。
  • 是的。这就是人生。有时不得不做出艰难的选择。理论上“干净”的解决方案和实用的解决方案之间存在巨大差异(即在现实世界中的绝大多数情况下会发生什么) - 但是请注意,我说过我以后总是可以学习语言的细节,一次我实际上已经部署了脚本。
  • 无关但是 - 如果我没记错的话,两条腿走路对我来说似乎非常不自然。当我跌倒时,我有一个非常非常糟糕的经历——平躺在我的脸上。你看,我习惯用四肢爬行。但是,我意识到如果我走路/跑步而不是爬行,我可以走得更远,移动得更快。现在,我的脚趾高兴地蜷缩起来! - Perl 爱好者! :)
  • @morpheous:谁在谈论'理论上“干净”的解决方案'?一天学一门语言会很糟糕。学习一门语言没有“理论上“干净”的解决方案。这需要时间和精力以及合理的工程判断。不是理论。务实勤奋。在你犯了许多错误之后“以后”学习细节是不会发生的。您将被转移到一个不会造成太大损害的项目,并由务实的人取代(即学习解决方案架构和语言)。
  • IME, Programming Perl 如果您只是想学习一些基本的 Perl 并尽快完成一些工作,那么这本书是一本非常重要的读物。 Learning Perl 是一个更好的资源。一个有经验的程序员可以在几天内完成它并提高工作效率。不要误会我的意思,PP 是一本很棒的书,但如果你已经掌握了一些 Perl,它会更好。

标签: php python perl shell data-munging


【解决方案1】:

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

任务 A 的预告脚本 - 读取文件、格式​​化文件然后写入数据库。

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 的反感,我强烈建议您使用任何您熟悉的编程语言来完成上述“任务”。以上只是试图向您展示它可能并不那么神秘.当您不想重复自己时,您会变得神秘! :)

【讨论】:

  • 和python海报推荐的类似,如果数据是CSV或者二进制或者固定长度,有库(Text::CSV_XS, Parse::Binary, Parse::FixedLength)和函数(pack , unpack) 也可以轻松处理这些问题。哦,也类似于那张海报推荐的内容,让我补充一下,“Perl 擅长于此”(几乎所有脚本语言也是如此)。
  • 将其替换为实际有效的示例性现代代码。
  • 谢谢,达克西姆!我打算今晚这样做。 :)
【解决方案2】:

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

Python 擅长于此。请务必阅读 csv 模块,以免浪费时间自己发明。

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

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

对 MySQL 使用 mysqldb 模块。 SQLite 是 Python 内置的。

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

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

【讨论】:

  • @s.lott:“听起来你正在开始数据仓库之路”。当人们能够“逆向工程”这样的场景时,我喜欢它。确实你是对的,这是我正在建设的一种“穷人的数据仓库”
  • Perl 在这方面也很擅长。但是,如果您不关心 Perl,那么请继续使用 Python。或者红宝石。
【解决方案3】:

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

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

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

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

【讨论】:

  • 我怀疑 Python 至少会成为特色。我不太反感它,因为我过去玩过它。还早。我会等待,看看是否会出现共识意见。感谢您的宝贵意见
  • 投反对票的人能否有礼貌地评论为什么?
  • 可能是针对不受支持的意见。 s/Go with/I would go with/,s/You will most likely/I found Python/,并完全删除“来自C/C++背景”(尽管如果你来自/来自C/C++背景,并且真的觉得这在某种程度上是学习 Python 与 Perl 所花费时间的一个因素,然后随意编辑)。
  • runrig:我并不认为我的答案比其他没有被否决的答案更多地包含“不受支持的意见”,而且我已尽力提供资源链接这将有助于 OP 为自己做出决定。我个人认为这个网站上对这类问题的任何答案都将是一种意见,因为“我应该用什么语言写这个?”这个问题几乎没有一个单一的答案。
  • 另外,我认为“你最有可能”的评论是合适的考虑到 OP 已经表示他们在使用 Perl 时遇到了麻烦,但对 C 也有经验/C++,因此一般不会遇到编程问题,特别是 Perl。
猜你喜欢
  • 2012-07-03
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多