我有一个程序,目前从 FILE 1 读取,如下图所示,并匹配某些字符。 e.g
Type, Fruit, Description, quantity tropical, banana, tasty and yummy, 5 tropical, grapefruit, bitter and not yummy, 2 ... and so on
首先,我想为每个'Type','Fruit','Description','Quantity'创建哈希散列,并将不同的值存储在引用哈希中。使用下面的代码可以正常工作。
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),这将是一个包含每个散列哈希列的表('Type' ,'水果','描述','数量')。
答案 0 :(得分:3)
我同意散列哈希是一件好事,但我认为你不是以一种容易检索它的方式存储它。
你能做到的一种方式就是这样。
{ id_1 => {
data_1 => "blah",
data_2 => "foo",
...
},
id_2 => {
...
},
...
}
首先,您需要选择哪个列为“ID”。这将决定每个ROW的唯一性。让我们说你的例子让我们选择水果,因为我们假设没有两个水果会出现在同一个文件中。所以我们会有这样的事情:
{ 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
}
答案 1 :(得分:2)
要编写Excel文件,您可以使用Spreadsheet::WriteExcel。
关于CSV文件 - 最初您的CSV文件带有“,”分隔符和“\ n”字符串分隔符。如果你想将一些hashrefs数组写入CSV - 更好的方法是自己写下简单的sub,就像这样的一样:
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);