9

現在、以下のように見え、特定の文字に一致するファイル 1から読み取るプログラムがあります。例えば

種類、果実、説明、数量
トロピカル バナナ おいしくておいしい 5
トロピカル、グレープフルーツ、苦くて美味しくない、2
... 等々

まず、「タイプ」、「フルーツ」、「説明」、「数量」ごとにハッシュのハッシュを作成し、さまざまな値を参照ハッシュに格納したいと考えました。以下のコードで問題なく動作します。

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)に入れる方法です。これは、ハッシュの各ハッシュ(「タイプ」、「フルーツ」、「説明」、「数量」)。

4

2 に答える 2

3

ハッシュのハッシュは良いことだと私は同意しますが、簡単に取得できる方法でそれを保存していないと思います。

あなたがそれをすることができる1つの方法はこのようなものです。

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

まず、どの列が「ID」になるかを選択する必要があります。これにより、各行の一意性が決まります。同じファイルに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

}
于 2012-11-28T14:40:47.757 に答える
2

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

CSV ファイルについて - 元々、「,」区切り記号と「\n」文字列区切り記号を含む CSV ファイルがあります。ハッシュリファレンスの配列を 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);
于 2012-11-27T17:00:59.700 に答える