0

サーバー(Ubuntuサーバー8.04 TLSを実行)でいくつかのタスクを実行するために、いくつかのスクリプトを作成する必要があります。タスクは定期的に実行されるため、スクリプトをcronジョブとして実行します。

タスクを「グループA」と「グループB」に分けました。(少なくとも私の考えでは)少し違うからです。

タスクグループA

  1. ファイルからデータをインポートし、場合によっては再フォーマットします。再フォーマットとは、データのサンティゼーション、正規化、データの「列」での計算などを行うことを意味します。

  2. 変更されたデータをデータベースにインポートします。今のところ、インポートの大部分にmySQLを使用していますが、一部のファイルはsqlLiteデータベースにインポートされます。

注:ファイルのほとんどはテキストファイルですが、一部のファイルはバイナリ形式(私が開発したC ++アプリケーションによって作成された独自の形式)です。

タスクグループB

  1. データベースからデータを抽出する
  2. データに対して計算を実行し、データベースにテーブルを挿入または更新します。

私のコーディング経験は主にC/C ++開発者ですが、過去2年ほどPHPも使用しています(+この質問の目的に関係のない他のいくつかの言語)。私はWindowsのバックグラウンドを持っているので、まだLinux環境に足を踏み入れています。

私の質問はこれです-私は上で説明したタスクを実行するためにスクリプトを書く必要があります。シェルスクリプトで使用するC++アプリケーションをいくつか作成できると思いますが、スクリプト言語で作成した方がよいと思いますが、これは誤った想定である可能性があります。私の考えでは、スクリプト内のものを変更する方が簡単です。機能を変更するために再構築する必要はありません。さらに、C++でのC++データの変更には、PerlやPythonなどの「自然な」スクリプト言語よりも多くのコード行が含まれる傾向があります。

ここにいる大多数の人々がスクリプトが進むべき道であることに同意すると仮定すると、ここに私のジレンマがあります。上記のタスクを実行するためにどのスクリプト言語を使用しますか(私の背景を説明します)?

私の直感は、Perl(shudder)が上記のすべてのタスクを実行するための最も明白な選択であることを教えてくれます。しかし(そしてそれは大きなことです)。しばらく前にPerlについて非常に悪い経験をしたので、Perlについて言及するだけで、つま先が丸くなります(Perl Camelの本と「Perlでデータを変更する」を何年も前に購入しましたが、それでも「grok」することはできませんでした。構文は私にはかなり不自然に思えます-何度もそれを学ぼうとしましたが-可能であれば、私は本当にそれを見逃したいと思います。PHP(私はすでに知っています)も確かではありませんCLIでスクリプトを作成するのに適した候補です(これを行う方法などの例はあまり見たことがないので、間違っている可能性があります)。

最後に言及しなければならないのは、これを行うために新しい言語を学ぶ必要がある場合、これを行うために必要な主要なコマンド/機能を学ぶのに1日以上費やす余裕がない(時間の制約)ということです(スクリプトを実際にデプロイした後は、いつでも言語の詳細を学ぶことができます)。

では、どのスクリプト言語をお勧めしますか(PHP、Python、Perl、[ここにお気に入りを挿入])-そして最も重要なのはなぜですか?または、シェルスクリプトで呼び出す小さなC ++アプリケーションの作成に固執する必要がありますか?

最後に、スクリプト言語を提案した場合は、数行で示してください(Perl mongers-私はあなたの方向を見ています[あまりにも不可解です!])私が試していることを行うためにあなたが提案した言語をどのように使用できるかすなわちする

  • データ操作のためにデータ列に簡単にアクセスできるある種のデータ構造にCSVファイルをロードします
  • 列データをmySQLテーブルにダンプします
  • mySQLテーブルからデータ構造にデータをロードして、スクリプト言語で列/行にアクセスできるようにします

うまくいけば、スニペットによって、私にとって最も急な学習曲線をもたらす言語と、シンプルでエレガントで効率的な言語(これらの2つの基準[優雅さと浅い学習曲線]が直交していないことを願っています)をすばやく見つけることができますが、私は彼らがそうであるかもしれないと思う)。

4

3 に答える 3

4

さて、私は数年前にあなたでした。Perlがまったく好きではなかったので、Perlで書いたスクリプトをPythonに書き直しました。Perlに耐えられなかったからです。簡単に言えば、私は今Perlにかなり精通しているとだけ言っておきましょう。本当に重要なことを非常にうまく説明し、私をPerlに変えた「ImpatientPerl」という本をお勧めします。:)もう1つは、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に対する現在の嫌悪感を考えると、使い慣れたプログラミング言語で上記の「タスク」を実行することをお勧めします。上記は、結局のところそれほど不可解ではない可能性があることを示すための試みにすぎません。繰り返したくないときは、謎めいてしまいます!:)

于 2010-05-14T12:59:25.513 に答える
3

ファイルからデータをインポートし、場合によっては再フォーマットします

Pythonはこれに優れています。csv自分で発明する時間を無駄にしないように、必ずモジュールを読んでください。

バイナリデータの場合、structモジュールを使用する必要がある場合があります。[バイナリデータを生成するC++プログラムを作成した場合は、そのプログラムを書き直して、バイナリデータの使用を停止することを検討してください。あなたの人生は長期的にはよりシンプルになります。ディスクストレージはあなたの時間よりも安いです。高度に圧縮されたバイナリ形式は、価値よりもコストがかかります。]

変更されたデータをデータベースにインポートします。データベースからデータを抽出するデータに対して計算を実行し、データベースにテーブルを挿入または更新します。

mysqldbMySQL用のモジュールを使用します。SQLiteはPythonに組み込まれています。

多くの場合、独自のSQLを作成するのではなく、オブジェクトリレーショナルマッピングを使用することをお勧めします。これを見てsqlobjectくださいsqlalchemy

また、これをやりすぎる前に、データウェアハウジングに関する優れた本を購入してください。2つの「タスクグループ」は、データウェアハウスの道を歩み始めているように聞こえます。貧弱なデータベース設計によって、これをすべて汚すのは簡単です。他のことをする前に、「スタースキーマ」とは何かを学びましょう。

于 2010-05-14T10:55:56.300 に答える
1

PythonかRubyを使います。あなたはおそらくそれらをPerlよりもはるかに速く/簡単に拾い上げることができるでしょう、そしてそれらはそれ自体が「データの改ざん」のた​​めの非常に強力で効率的な言語です。ランダムなライブラリ関数を頻繁に検索することを数えずに、1日以内にそれらのいずれかを取得できるはずです。

Pythonをすばやく入手するには:http://diveintopython3.ep.io/

私自身はRubyチュートリアルをお勧めすることはできませんが、他の人が良いオプションでチャイムを鳴らすことができると確信しています。

どちらかを試してみたい場合は、http://www.trypython.orghttp://www.tryruby.orgがそれぞれ、それぞれの言語のインタープリターのオンラインインタラクティブシェルバ​​ージョンをホストしています。

于 2010-05-14T10:15:14.110 に答える