首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数据处理和数据导入脚本

数据处理和数据导入脚本
EN

Stack Overflow用户
提问于 2010-05-14 10:10:37
回答 3查看 833关注 0票数 0

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

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

任务组A

  1. 从文件中导入数据并可能对其重新格式化--通过重新格式化,我的意思是做一些事情,比如对数据进行格式化,可能将其规范化,或者在data
  2. 的“列”上运行计算,将所存储的数据导入数据库。目前,我主要使用mySQL进行绝大多数导入--尽管有些文件将导入到sqlLite数据库中。

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

任务组B

database

  • Perform

  • 从数据的

  • 计算中提取数据,并在数据库中插入或更新表。

我的编码经验主要是作为一个C/C++开发人员,尽管我在过去两年中也一直使用PHP (+其他几种与这个问题无关的语言)。我来自Windows背景,所以我仍然在Linux环境中找到自己的脚。

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

假设这里的大多数人都同意编写脚本是可行的方法,这就是我的困境所在。我使用哪种脚本语言来执行上面的任务(给出我的背景)?

我的直觉告诉我,Perl (颤抖)将是执行上述所有任务的最明显的选择。但是(这是一个很大的但是)。一提到Perl,我的脚趾就皱了起来,因为我在很久以前就有过一次非常、非常糟糕的体验(许多年前买了Perl Camel书+“用Perl咀嚼数据”,但仍然不能“摸索”,只是感觉太陌生了。这个语法对我来说是很不自然的--尽管我已经试过很多次了--所以如果可能的话,我真的很想忽略它。PHP (我已经知道了),也不确定是否适合在CLI上编写脚本(我还没有见过很多关于如何这样做的例子,所以我可能错了)。

我必须提到的最后一件事是,如果我必须学习一种新语言才能做到这一点,那么我就负担不起(时间限制)花一天以上的时间来学习完成这一任务所需的关键命令/特性(一旦我实际部署了脚本,以后就可以学习语言的细节了)。

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

最后,如果您建议使用一种脚本语言,那么请用几行代码显示(Perl mongers --我正朝您的方向看--没什么太神秘的!)我怎样才能用你建议的语言来做我想做的事呢?

将CSV文件加载到某种数据结构中,可以轻松地访问数据列以获取数据manipulation

  • dump,将列数据加载到mySQL表

  • 中,将mySQL表中的数据加载到允许在脚本语言

中访问列/行的数据结构中。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-05-14 10:55:56

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

Python在这方面很擅长。一定要阅读csv模块,这样您就不会浪费时间自己发明它了。

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

将已处理的数据导入数据库。从数据库中提取数据,对数据执行计算,然后在数据库中插入或更新表。

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

通常,您希望使用对象-关系映射,而不是编写自己的SQL。看看sqlobjectsqlalchemy就知道了。

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

票数 3
EN

Stack Overflow用户

发布于 2010-05-14 12:59:25

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

Task脚本-读取一个文件,格式化它,然后写到数据库。

代码语言:javascript
运行
复制
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的厌恶,我建议您使用您熟悉的任何编程语言执行上述“任务”。以上只是试图向你表明,它可能不是那么神秘毕竟。当你不想重复你自己的时候,你会变得很神秘!:)

票数 4
EN

Stack Overflow用户

发布于 2010-05-14 10:15:14

我会和Python或者Ruby一起去。您很可能会发现它们比Perl要快/容易得多,而且它们本身仍然是非常强大/高效的语言,用于“数据处理”。您应该能够在一天或更短的时间内找到它们中的任何一个,而不包括经常查找随机库函数。

要快速拾起Python:http://diveintopython3.ep.io/

我个人不能自己推荐Ruby教程,但我相信其他人也能加入好的选择。

如果您想玩这两种语言之一,http://www.trypython.orghttp://www.tryruby.org分别为各自语言提供在线交互式shell版本的解释器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2833312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档