2012-11-27 13 views
8

Mam program, który w tej chwili czyta z FILE 1 wygląda jak poniżej i pasuje do niektórych znaków. npNapisz do pliku CSV z hash perl

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

Przede wszystkim chciałem stworzyć skrót skrótów dla każdego „typ”, „owoce”, „Opis”, „ilość” i przechowywać różne wartości w mieszań referencyjnych. Działa to dobrze z poniższym kodem.

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;      

Więc moje pytanie jest Jak mogę umieścić te dane (dane nie są stałe) do pliku csv lub cokolwiek związane (może xls), który będzie tabela z kolumnami dla każdego skrótu skrótów (” Wpisz "," Fruit "," Description "," Quantity ").

+3

Czy próbowałeś już uruchomić swój kod? Ma błędy kompilacji. Powinieneś zacząć od ich naprawienia, a następnie spójrz na [Text :: CSV] (http://p3rl.org/Text::CSV) (który wydaje się, że już znalazłeś się). – simbabque

+0

hi @simbabque tak to nie jest oryginalny kod, to tylko przykład. Spojrzałem na Text :: CSV, ale nie jestem pewien, jak z niego korzystać. –

+0

@El_Commandantee, jeśli tylko do użytku lub możesz napisać "brudny" kod, bez modułów i innych rzeczy, możesz napisać kod przy użyciu podstawowych funkcji Perla easy – gaussblurinc

Odpowiedz

3

Zgadzam się, że hashe z mieszań jest dobrą rzeczą, ale myślę, że” nie przechowuj go w taki sposób, abyś mógł go łatwo odzyskać.

Jednym ze sposobów, w jaki można to zrobić, jest właśnie to.

Przede wszystkim musisz wybrać kolumnę, która będzie "ID". To by określiło wyjątkowość każdego ROW. Powiedzmy, że dla twojego przykładu wybierzmy owoc, ponieważ zakładamy, że nie byłoby dwóch owoców, które pojawiłyby się w tym samym pliku. Tak więc chcielibyśmy mieć coś takiego:

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

Aby zmienić to z powrotem na CSV, przechodzimy przez skróty.

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

Do pisania plików Excel - można użyć Spreadsheet::WriteExcel.

Pliki CSV - pierwotnie masz plik CSV z ogranicznikami ciągów "," ogranicznik i "\ n". Jeśli chcesz napisać jakąś tablicę hashrefs do CSV - lepszy sposób spisać prosty sub przez siebie, czymś jak ten:

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

Który, z grubsza, kończy się niepowodzeniem w każdej komórce, która zawiera ogranicznik. – ugexe

+2

Myślę, że upvotes musi pochodzić od ludzi, którzy są pod wrażeniem tego, jak niejasny jest ten kod. Z pewnością nie odpowiada na pytanie – Borodin

+0

Dzięki za dobry PR, stary. Odpowiada przynajmniej na część pytania - jak pisać pliki Excela w Perlu i jak pisać pliki CSV - więc daje ogólny kierunek właściwej odpowiedzi, jeśli możesz poprawić kod. Zapisywanie niestandardowego pliku CSV zgodnie z wymaganiami wygląda bardziej jak zadanie niezależne niż tylko pytanie. – moonsly