Sunday, December 23, 2012

Parse Excel (*.xls & *.xlsx) File via PERL

Salam,

Lama tak post disini. selepas pemergian abah hujung bulan jun haritu. saya x ada idea nak tulis apa.

Baru hari ni ada kekuatan untuk menulis semula.

Harini saya nak kongsi mcmana nak parse excel fail yg mengunakan format MS Excel 2003(*.xls) dan kebawah serta format MS Excel 2007(*.xlsx).

Saya mengunakan PERL + Spreadsheet module dari CPAN.

Module Spreadsheet yg saya gunakan,

  • Spreadsheet::ParseExcel
  • Spreadsheet::XLSX

dua module di atas saya pilih sebab byk mengunakan function name yg hampir serupa cuma cara awal fail excel dibaca sahaja ada perbezaan dimana fail berformat *xlsx memerlukan iconv untuk dapat dibaca isi kandungannya.

Berikut contoh keratan

Untuk Fail berformat *.xls

################
sub getxls{
################ 
 
 use Spreadsheet::ParseExcel;
 
 opendir THISFILES, "$dir" or die "cannot open dir '$dir'";
 my @allfiles = readdir THISFILES;
 close THISFILES;
 foreach my $file(@allfiles){
  if($file =~ /\.xls$/i && $file !~ /^\~/i){
   
   my $parser   = Spreadsheet::ParseExcel->new();
   my $workbook = $parser->parse("$dir/$file");
   
   if ( !defined $workbook ) {
       #die $parser->error(), ".\n";
       print $parser->error() . "\n";
   }else{
    for my $worksheet ( $workbook->worksheets() ) {
     my ( $row_min, $row_max ) = $worksheet->row_range();
     my ( $col_min, $col_max ) = $worksheet->col_range();
     my $sheetname = $worksheet->get_name();
     print "$sheetname\n";
     
     for my $row ($row_min .. $row_max ) {
      for my $col ($col_min .. $col_max ) {
       my $cells = $worksheet->get_cell( $row, $col);
       my $cell='';
       if($cells){
        $cell = $cells->unformatted(); #unformated
        #$cell = $cells->value(); #clean
        print "$cell\t";
       }
      }
      print "\n";
     }
    }
   }
  }
 }
}

Untuk Fail berformat *.xlsx

################
sub getxlsx{
################
 
 use Spreadsheet::XLSX;
 use Text::Iconv;
 
 opendir THISFILES, "$dir" or die "cannot open dir '$dir'";
 my @allfiles = readdir THISFILES;
 close THISFILES;
 foreach my $file(@allfiles){
  if($file =~ /\.xlsx$/i && $file !~ /^\~/i){
   
   my $converter = Text::Iconv -> new ("utf-8", "windows-1251");
   my $workbook = Spreadsheet::XLSX->new("$dir/$file", $converter);
   
   if ( !defined $workbook ) {
       #die $parser->error(), ".\n";
       print $parser->error() . "\n";
   }else{
    for my $worksheet ( @{$workbook -> {Worksheet}} ) {
     my ( $row_min, $row_max ) = $worksheet->row_range();
     my ( $col_min, $col_max ) = $worksheet->col_range();
     my $sheetname = $worksheet->get_name();
     print "$sheetname\n";
     
     for my $row ($row_min .. $row_max ) {
      for my $col ($col_min .. $col_max ) {
       my $cells = $worksheet->get_cell( $row, $col);
       my $cell='';
       if($cells){
        $cell = $cells->unformatted(); #unformated
        #$cell = $cells->value(); #clean
        print "$cell\t";
       }
      }
      print "\n";
     }
    }
   }
  }
 }
}

if($file =~ /\.xlsx$/i && $file !~ /^\~/i){

Saya tapis untuk hanya fail *.xlsx sahaja diprosess. dan nama fail bermula dgn '~' juga di keluarkan dari senarai. PERL boleh membaca fail yang dhidden tetapi module ini akan menghasilkan ERROR apabila cuba memperosess fail sebegini. fail yg mengandungi '~' dipermulaan merupakan fail yg telah ditandakan untuk dibuang oleh OS ataupun sebagai fail backup. fail ini tidak boleh dilihat melalui fail browser.

happy coding....

Friday, July 6, 2012

Al-Fatihah untuk Arwah Abah

Assalamualikum..

Saya baru sahaja kehilangan insan yang saya sayangi... Abah....

Abah meninggal mengejut selepas balik dari kebun. abah sempat balik kerumah tetapi hanya sempat sampai di muka pintu rumah.

Abah menghembuskan nafas terakhir dipangkuan emak.

Semoga arwah abah ditempatkan di kalangan orang-orang yg beriman dan dikasihi oleh Allah. Amin.

Aku masih tidak dpt menerima hakikat yang abah telah tiada.....

Saturday, May 12, 2012

MySQL updating/add my.cnf on Mac OS X 10.6

Salam.... skop project sekarang ni byk bermain dgn data2 dlm kapasiti yg besar... hehehe aku rasa bleh tambah 1 lg expertise(bukan la expert sgt pun) dalam resume aku.... data crunching & massaging expert.. bukan itu sebenarnya aku nak sampaikan. apa aku nak kongsi adalah mcmana nak tambah/kemaskini my.cnf iaitu config file utk mysql server di Mac OS X 10.6 (snow leopard). aku ada keperluan utk tweak/ubah config utk support workload aku. by default mac os x x ada my.cnf didalam /etc/ folder dia. dia pakai dfault yg sekali mysql server. so kalau nak buat perubahan kene tambah/copy dr sample yg disediakan. copy sample my.cnf file dr mysql support folder ke folder /etc/
sudo cp /usr/local/mysql-5.5.8-osx10.6-x86_64/support-files/my-huge.cnf  /etc/my.cnf
kalau nak ubah atau kemaskini dah boleh buat dari /etc/my.cnf untuk memberi kesan, kene restart mysql server. boleh guna command ni:
sudo /Library/StartupItems/MySQLCOM/MySQLCOM restart
lepas tu bleh try connect pakai mysql client
mysql -uroot
kalau mysql server take fully restart, command kat atas ni tak akan berjaya. dia akan keluarkan error berkaitan 'cannot locate mysql.sock'. untuk kes aku, aku restart computer terus. ada tutorial suruh delete file mysql.server. tapi aku tak berjaya locate file tu. tapi selepas restart. mysql dah menggunakan config setting dari /etc/my.cnf yg baru kita tambah/ubah td. *sebenarnya masalah mysql server tak fully restart/stop aku dah hadapi beberapa kali. sebelum ni terjadi di server CentOs dimana aku dah buat hal dkt live server client aku.... hehehehe... tapi kat server client aku lg teruk. mysql server running mcm zombie. tak dpt detect pid. so tak boleh stop/kill. or aku p[unya ilmu sendiri yg tak cukup. tapi solution yg boleh dipakai ialah... RESTART COMPUTER/SERVER..... hahahahha

Friday, April 13, 2012

i'm back ... again

Salam,

Lama tak menulis... ada masalah skit dgn domain mbek.net. makan bulan gak nak solve... nasib baik arini setel semua... legaaa.....

apapun.. i'm back....

Friday, January 27, 2012

Kedai Makan

Tiba-tiba teringat satu kenangan sewaktu out station masa mula2 kerja dulu.

Masa tu kene buat installation di client site(tahun 2002 kalau tak silap aku). ptg tu kami pergi ke ladang/estate tempat kami akan buat instalation. survey2 keperluan dan apa yg kami perlu sediakan. keluar dari ladang dah agak malam... sebelum balik ke hotel. kami singgah dulu di kedai makan di suatu tempat di kawasan temerloh (kerdau lebih tepat). kami sampai di kedai makan tu dalam pukul 10+-mlm..

as semua tgh lapar, kami order agak byk, dari lauk2 standard sampai la ke sup ekor(1st time makan sup ekor waktu tu... and still the best sup ekor aku pernah rasa). semua sekali ada dlm 4/5 org yg makan. memang semua tgh kelaparan.... sambil diaorg bersembang lepas makan aku ambik kesempatan menyiapkan preparation utk installation esok pagi.

Air dah masuk 3 kali order. diaorg semua masih bersembang sebab menemankan aku siapkan preparation utk esok pagi nya. sebab kalau dah balik bilik... sure terus kaboommm....

aku siap/setel ngam2 bila battery laptop aku pun nak habis... masa tu jam dah dekat pukul 2 pagi. baru perasan tinggal kami satu meja sahaja yg ada kat kedai makan tu.

Panggil tokei kedai tu suruh kira... bila dpt duit balance... membe sorg tergerak nak bertanya kat tokei kedai tu.... pukul berapa tutup kedai...... jawap tokei kedai tu... dengan senyuman yg x pernah putus... ".... biasa tutup pukul 11 lebey atau pukul 12...." .... tergamam kami semua.... mintak maaf banyak2 kami kat tokei kedai tu... tapi dia sedikit pun tak marah akau buat masam muka....

apa yg membuatkan kami x perasan ialah:

  1. Tokei kedai@pelayan dia tidak menunjukkan tanda2 atau apa2 signal pun kepada kami mengatakan yg dia dah nak tutup kedai.
  2. Tak tutup 1 lampu pun padahal tinggal kami satu meja sahaja kat kedai dia.
  3. Tak susun satu kerusi pun sebagaimana tanda2 org nak tutup kedai seperti mana biasa yg dilakukan kedai2 makan yg biasa kita singgahi.
  4. tokei kedai@pelayan tak ada pandang kami pun.
  5. walaupun kami buat order kali yg ke 3/4 utk air itu pun dia x da cakap kedai dah nak tutup... dia masih menerima order kami. masih sedap gak air yg mereka buat.

Cuma yg kami perasan mereka semua berkumpul depan tv ramai2.... tu jer.....

Malu & Kagum dgn tokei kedai tu. sebelum balik kami minta maaf cukup2 dgn tokei kedai & pelayan2 dia... kami masuk kereta shj baru mereka semua tutup lampu & susun kerusi meja semua....

kalau di KL? payah nak jumpa mcm tu.......

Monday, January 2, 2012

Net::Twitter::Lite update_with_media support for uploading image to twitter.com

Salam,

as Net::Twitter::Lite version 0.10004, there's no function for update_with_media.

as i'm really need to post some pic to twitter. i make some changes to very useful easy to use Net::Twitter::Lite.

changes only ad file Lite.pm.

add after line: 23

        uploadurl => 'http://upload.twitter.com/1',

at line: 331, change from

                        Content_Type  => 'form-data',
to
                        Content_Type  => 'multipart/form-data',
*i'm just playing safe with this.

at line: 387, change from

         ? POST($uri, Content_Type => 'form-data', Content => [ %$args ])
to
         ? POST($uri, Content_Type => 'multipart/form-data', Content => [ %$args ])
*i'm just playing safe with this too.

Add after line: 1198

        [ 'update_with_media', {
            aliases     => [ qw// ],
            path        => 'statuses/update_with_media',
            method      => 'POST',
            params      => [ qw/status media[] lat long place_id display_coordinates in_reply_to_status_id trim_user include_entities/ ],
            required    => [ qw/status media[]/ ],
            add_source  => 1,
            deprecated  => 0,
            authenticate => 1,
            booleans    => [ qw/display_coordinates trim_user include_entities/ ],
        base_url_method => 'uploadurl',
        } ],

That's all.

And to use this function:

$result = eval { $nt->update_with_media({status => "$tweettext", media => ["/path/to/image.png"]}) };

my previous post, Post to Twitter Using Perl

You can download Lite.pm here.