2012-11-27 8 views
8

私は現在、FILE 1から、特定の文字と一致するように見えるプログラムを持っています。例えば、私は各「種類」、「果物」、「説明」、「数量」のためのハッシュのハッシュを作成し、参照ハッシュに異なる値を格納したいすべてのハッシュperlからCSVファイルに書き込む

Type, Fruit, Description, quantity 
tropical, banana, tasty and yummy, 5 
tropical, grapefruit, bitter and not yummy, 2 
... and so on 

まず。それは下のコードで正常に動作します。

use strict; 
use warnings; 
use Data::Dumper; 
use Text::CSV; 

my %MacroA = ('Type' => {}, 'Fruit' => {}, 'Description' => {}, 'Quantity' => {});   

open (my $file, '<', 'FRUITIES.txt') or die $!;  

while (my $line = <$file>)                {           

if ($line =~ /\b(tropical)\b,/) {         
$MacroA{Type}->{$1}++; 
} 

if ($line =~ /,\b(banana|grapefruit)\b,/) {        
$MacroA{Fruit}->{$1}++; 
} 

if ($line =~ /,([\w\s]+?),/) {         
$MacroA{Description}->{$1}++; 
} 

if ($line =~ /,([\d]+?)/) {        
$MacroA{Quantity}->{$1}++; 
} 
     } 

close $file;      

だから私の質問は、「私はそれがハッシュの各ハッシュの列を持つテーブルになり、csvファイルまたは関連するもの(多分XLS)に(データが固定されていない)、このデータを置くことができますどのように(あります「フルーツ」、「説明」、「数量」)。

+3

コードを実行しようとしましたか?コンパイルエラーがあります。それらを修正してから始めて、[Text :: CSV](http://p3rl.org/Text::CSV)(これはあなた自身が既に見つかったようです)を見てください。 – simbabque

+0

こんにちは@simbabqueはいこれは元のコードではなく、単なる例です。私はText :: CSVを見ていましたが、使い方がわかりません。 –

+0

@El_Commandanteeあなたの使用のためだけであれば、モジュールやその他のものがなくても、「汚い」コードを書くことができれば、Perlコアの機能を簡単に書くことができます – gaussblurinc

答えて

3

が、私はあなたを思う: - あなたには、いくつかのCSVへのハッシュリファレンスの配列を作成したい場合は、自分で簡単なサブを書き留めてより良い方法を、この1のようになめらかあなたは簡単にそれを取得することができます方法でそれを格納しないでください。

これを行うには1つの方法があります。

{ id_1 => { 
      data_1 => "blah", 
      data_2 => "foo", 
      ... 
      }, 
    id_2 => { 
      ... 
      }, 
    ... 
} 

最初に、どの列を「ID」にするかを選択する必要があります。これにより、各ROWの一意性が決まります。たとえば、同じファイルに2つの果物が存在しないと仮定しているので、果物を選んでみましょう。したがって、次のようなものがあります。

{ banana => { 
      type => "tropical", 
      description => "tasty and yummy", 
      ... 
      }, 
    grapefruit => { 
      ... 
      }, 
    ... 
} 

これをCSVに戻すには、ハッシュをループします。

my %fruit_data; #let's assume that this already has the data in it 

foreach my $fruit (keys %fruit_data) { 

    #given the $fruit you can now access all the data you need 
    my $type = %fruit_data{$fruit}{'type'}; 
    my $desc = %fruit_data{$fruit}{'description'}; 
    # etc... 

    # then you may want to store them in a scalar in any order you want 
    my $row = "$field,$type,$desc etc.\n"; 

    # then work your way from there 

} 
2

Excelファイルを書き込む場合は、Spreadsheet::WriteExcelを使用できます。

CSVファイルについて - もともと、 "、"区切り文字と "\ n"文字区切り文字を持つCSVファイルがあります。 「私はハッシュのハッシュは良いことであることに同意

use strict; 
use warnings; 

sub write_csv { 

    my ($array_ref, $fh) = @_; 

    for my $row (@$array_ref) { 
    print $fh join(',', map { $_, $row->{$_} } sort keys %$row), "\n"; 
    } 
} 

my $test = [ 
    {a => 1, ab => 2, type => '234k', count => '123'}, 
    {a => 3, ab => 2, type => 'some_type', count => 34}, 
]; 

open my $fh, '>', 'test.csv' or die $!; 

write_csv($test, $fh); 
+2

区切り文字を含むセルで粗いものが失敗します。 – ugexe

+2

私はupvotesがこのコードがどれほど曖昧であるかに感銘を受けた人から来ているに違いないと思います。それは確かに質問に答えることはありません – Borodin

+0

良いPR、男のためにありがとう。それは質問の少なくとも一部に答えます - ハウツーはPerlでファイルを書き出し、CSVファイルを書く方法を書いています - そうすれば、コードを微調整することができます。要件に応じてカスタムCSVファイルを書くことは、単なる質問よりも、フリーランスの仕事のように見えます。 – moonsly

関連する問題