AcmeなるモジュールをCPANに求めて

makamaka
2010-12-19

(firstly written in Japanese, later in English)

こんにちは。makamakaです。
書く人がいないので埋め草的な記事です。Acme大全2010の使い回しです。

CPANでも割とユニークだと私が感じるモジュールを紹介しましょう。十分Acmeなモノです。
Text::CSV::UniqueColumns。CSVファイルから重複しない値を持ったカラムを探すモジュールです。

# ヘッダを持ったCSVファイル
#------- foo.csv ------
col1,col2,col3,col4
1,a,1,a
2,b,1,b
3,a,2,c
4,a,2,d
#-----------------------

use strict;
use Text::CSV::UniqueColumns;

$csv  = Text::CSV::UniqueColumns->new( 'foo.csv' );

print $csv->checkUniq('col1'); # => 1

print $csv->getUniqCols();     # => col1,col4

で、まあ、Text::CSVを使って値を調べたりするのかなと思ってソースを見たのですよ。そしたら

sub getUniqCols {
(中略)
    my $sCmd = "cut -f$iField -d , $self->{'_file'} | sed s/' '//g | wc -l;";
    $sCmd .= "cut -f$iField -d ,  $self->{'_file'} | sed s/' '//g | sort | uniq | wc -l";
    my ($iCount1, $iCount2) = split("\n",`$sCmd`);

あー……

sub checkUniq {
(中略)
    my $sCmd = "paste  -d , $sPasteFiles > pasteOutput ";
    push (@cleanup, 'pasteOutput');
    $sPasteOutput = `$sCmd`;
    my $iCount1 =  `cat pasteOutput | sed s/' '//g | wc -l`;
    my $iCount2 =  `cat pasteOutput | sed s/' '//g | sort | uniq |  wc -l`;


あー……

sub cleanUp {
    foreach my $sFile (@cleanup){
        `rm -f $sFile`;
    }
}

↑そこはかとなく不安感を醸し出すコード


はい、なんだか不思議な気持ちになりましたね? 十分Acmeなモノです。

というわけで、このお正月はAcme的なモノを求めて夢の世界に……





* ----------------------------------------------------
* English version
* ----------------------------------------------------
TITLE: The Acme-Quest of Unknown CPAN

Hello everyone. I'm makamaka.
As no one writes articles, I worte.

I introduce a module felt as a unique module on CPAN. Enough Acme.
Text::CSV::UniqueColumns.
It finds columns which have unique values.

# a csv file which has its header.
#------- foo.csv ------
col1,col2,col3,col4
1,a,1,a
2,b,1,b
3,a,2,c
4,a,2,d
#-----------------------

use strict;
use Text::CSV::UniqueColumns;

$csv  = Text::CSV::UniqueColumns->new( 'foo.csv' );

print $csv->checkUniq('col1'); # => 1

print $csv->getUniqCols();     # => col1,col4

Firstly I thought using Text::CSV.
And I look at the source.

sub getUniqCols {
...
    my $sCmd = "cut -f$iField -d , $self->{'_file'} | sed s/' '//g | wc -l;";
    $sCmd .= "cut -f$iField -d ,  $self->{'_file'} | sed s/' '//g | sort | uniq | wc -l";
    my ($iCount1, $iCount2) = split("\n",`$sCmd`);


Ah....

sub checkUniq {
...
    my $sCmd = "paste  -d , $sPasteFiles > pasteOutput ";
    push (@cleanup, 'pasteOutput');
    $sPasteOutput = `$sCmd`;
    my $iCount1 =  `cat pasteOutput | sed s/' '//g | wc -l`;
    my $iCount2 =  `cat pasteOutput | sed s/' '//g | sort | uniq |  wc -l`;


Ah....

sub cleanUp {
    foreach my $sFile (@cleanup){
        `rm -f $sFile`;
    }
}

↑somehow anxious code. Enough Acme.


Well, in this winter vacation, would you like to travel to dream land for Acme...