Veri munging ve veri alma betik

3 Cevap php

Ben (Ubuntu sunucu 8,04 TLS çalıştıran) benim sunucuda bazı görevleri yürütmek için bazı komut dosyaları yazmak gerekir. Görevler periyodik olarak çalıştırmak için, bu yüzden cron işleri gibi komut çalışıyor olacak.

Ben "Grup A" ve "B grubu" olarak görevleri bölünmüş - (aklımda en azından), onlar biraz farklı çünkü.

Task Group A

  1. muhtemelen bir dosya ve ithalat verileri yeniden biçimlendirmek - biçimlendirerek, ben, verileri santizing muhtemelen onu normalleştirilmesi ve veya verilerin 'sütunlarında' üzerinde hesaplamalar koşma gibi şeyler yapıyor demek

  2. Bir veritabanına munged verileri alın. Şimdilik, çoğunlukla ithalatın büyük çoğunluğu için mySQL kullanıyorum - Bazı dosyalar SQLLite veritabanına ithal edilecektir rağmen.

Not: dosyaları çoğunlukla metin dosyaları olacak, bazı dosyalar (I geliştirilmiş bir C + + uygulama tarafından yazılan kendi mülkiyet biçimi) bir ikili formatta olmasına rağmen.

Task Group B

  1. Veritabanından veri ayıklamak
  2. Veritabanında veri ve ekleme veya güncelleştirme ya tablolarda hesaplamalar gerçekleştirin.

Benim kodlama deneyim ben son 2 yıl ya da öylesine (+ bu sorunun amacıyla ilgili olmayan birkaç diğer dillerde) için de PHP kullanıyor olmasına rağmen, öncelikle bir C / C + + geliştiricisi olarak olmasıdır. Ben hala linux ortamında ayaklarım bulma kulüpler bu yüzden bir pencere arka plan duyuyorum.

Benim soru bu - Ben yukarıda açıklanan görevleri gerçekleştirmek için komut yazmak gerekir. Ben kabuk komut kullanılmak üzere birkaç C + + uygulamaları yazabilirsiniz varsayalım rağmen, (belki bu bir kusurlu varsayım nedir?) Bir betik dili olarak bunları yazmak daha iyi olabilir düşünüyorum. Işlevsellik değişiklikleri vb yeniden inşa etmek gerek - Benim düşünce bir komut şeyleri değiştirmek için daha kolay olurdu olduğunu. Ayrıca, C + + vb Perl, Python gibi "doğal" betik dilleri daha kod daha fazla satır içeren eğilimi içinde munging C + + veri

Burada insanların çoğunluğu betik gitmek için yol olduğunu kabul ettiğini varsayarak, burada benim ikilem yatıyor. Hangi betik dili (benim arka plan vererek) Yukarıdaki görevleri gerçekleştirmek için kullanılacak.

Benim gut içgüdüsü Perl (shudder) Yukarıdaki tüm görevleri gerçekleştirmek için en belirgin seçim olacağını söylüyor. BUT (ve bu büyük bir ama). Perl sadece söz ben Perl Deve kitabı yıllar önce + 'Perl ile munging veri' aldım (bir süre önce onunla çok, çok kötü bir deneyim oldu gibi, benim ayak curl yapar, ama yine de sadece 'grok' değil çok yabancı hissettim sözdizimi bana oldukça doğal görünüyor -. onu öğrenmek denedim kaç kere rağmen - bu nedenle eğer mümkünse, ben gerçekten o bir bayan (ben zaten biliyorum) PHP vermek istiyorum, aynı zamanda emin değilim. CLI komut dosyası için iyi bir aday (- bu yüzden yanlış olabilir ben bu vb yapmak konusunda birçok örnekler görmedim).

Ben belirtmek zorundadır son şey bunu yapmak için yeni bir dil öğrenmek zorunda IF, ben (bunu yapmak için gerekli tuş komutları / özelliklerini öğrenme, bir gün daha fazla harcama için (zaman kısıtlaması) göze alamaz olmasıdır Aslında komut dağıtmış sonra hep), daha sonra dilin ayrıntılarını öğrenebilirsiniz.

Ve en önemlisi NEDEN - Yani, hangi betik dili ([Burada favori insert] PHP, Python, Perl,) önerebilirim?. Ya da, ben sadece bir kabuk çağırın az C + + uygulamaları yazma ayrılmamak gerekir?.

Eğer bir betik dili önerdi eğer Son olarak, bir BİRKAÇ hatları ile gösterebilir misiniz (Perl tacirleri - Ben senin yönde arıyorum [çok gizli bir şey!] ;)) Ne yapmam için size önerilen dil kullanımı nasıl yapmaya çalışıyorum yani

  • Bir CSV veri manipülasyonu için kolayca veri sütunları erişebilirsiniz veri yapısının bir tür içine dosya yüklenemedi
  • mySQL tabloya sütunlu veri dökümü
  • sütun / satır betik dili olarak erişilebilir olanak veren bir veri yapısı içine mySQL tablodan veri yükleme

Yanı sıra o, sade, şık ve verimli (umarım bu iki kriter [zerafet ve sığ bir öğrenme eğrisi] dik değil bu - - Yine şüpheli Umarım, parçacıkları beni çabuk benim için dik bir öğrenme eğrisi teşkil edecek dilleri nokta sağlayacak onlar) olabilir.

3 Cevap

muhtemelen bir dosya ve gelen ithalat verileri yeniden biçimlendirmek

Python bu üstünlük. Bunu kendiniz icat vakit kaybetmeyin böylece csv modülü üzerinde okumak emin olun.

Ikili veri için, struct modülü kullanmanız gerekebilir. Eğer ikili veri üreten C + + program yazdı [, ikili verileri kullanarak durdurmak için bu programı yeniden düşünün. Hayatın uzun vadede daha basit olacaktır. Disk depolama zaman daha ucuzdur; Yüksek oranda sıkıştırılmış ikili biçimler değerinden daha fazla maliyet vardır.]

Import the munged data into a database. Extract data from the database Perform calculations on the data and either insert or update tables in the database.

MySQL için mysqldb modülünü kullanın. SQLite yapılı-Python için.

Genellikle, Nesne-İlişkisel eşleme kullanmak yerine kendi SQL yazmak isteyeceksiniz. Bunun için sqlobject ve sqlalchemy bak.

Ayrıca, bu çok fazla yapmadan önce, veri ambarı üzerinde iyi bir kitap satın alın. Eğer veri ambarı yolda başlıyoruz gibi iki "görev grupları" sesi. Bu tüm yoksul veritabanı tasarımı aracılığıyla faul almak kolaydır. Eğer başka bir şey yapmadan önce bir "Yıldız Şeması" ne olduğunu öğrenin.

Well, I was you a few years back. Didn't like Perl at all and would re-write any scripts my peers wrote in Perl back to Python - because I could not stand Perl. Long story short - let's just say I am fairly conversant with Perl now. I would recommend a book called "Impatient Perl" which explains the really important stuff quite nicely and which converted me to Perl. :) Another thing, is to install the Perl documentation on your computer - this was really important for me - easy and quick access to sample code, etc.

Görev A Teaser Script - Bir dosyayı okumak biçimlendirmek ve daha sonra veritabanına yazmak için.

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);
        }
    }
}

Not: Perl için geçerli tiksinme göz önüne alındığında, ben de size yukarıda içeri rahat herhangi bir programlama dilinde yukarıdaki "görevleri" bunu tavsiye ederim o kadar da şifreli olmayabilir size göstermek için sadece bir girişimdir. Kendinizi tekrarlamak istemiyorum zaman şifreli olmak olsun! :)

Python ya da Ruby ile gitmek istiyorum. Büyük olasılıkla much daha hızlı / daha kolay Perl daha almak için onları bulacaksınız, onlar "veri munging" için kendi başlarına hala dillerde verimli / çok güçlüdür. Her öylesine sık sık rastgele kütüphane işlevleri bakarak sayma değil, bir gün veya daha az ikisini almak gerekir.

Hızlı Python almak için: http://diveintopython3.ep.io/

Ben şahsen bir Ruby kendimi öğretici tavsiye edemez, ama diğerleri iyi seçenekleri ile uymak eminim.

Eğer kendi dilleri için de, http://www.trypython.org ve tercümanların http://www.tryruby.org Her ana çevrimiçi etkileşimli kabuk sürümleri ile uğraşmak istiyorum.