Holvannak a hibák a megoldásként létrehozott kódban?
Adott egy csv fájl amely a következő adatokat tartalmazza pontosvesszővel határolva:
sorszám, dátum és idő, terméknév, eladási ár
pl. :
1;2004. 01.17 13:19;Eper;5997.35
készítsünk perl szkriptet, amely összegzést készít arról, hogy melyik termékből hányszor vásároltak és mennyi összértékben. az összegzés történjen html táblázat formájában. a feladat megoldása során használjuk a use strict; utasítást. A megoldásunk müködjön ugyanilyen felépítésű de más tartalmú adatfájl esetében is. a táblázat generálásakor szedje vastag betűvel a termék neveit illetve a táblázat fejlécét. példa kimenet:
Gyümölcs Darabszám Összár
Alma 88 419604.25
#!/usr/bin/perl -w
use strict;
open (CSV, "termek.csv")
or die "nem található a fájl";
my @sorok;
my $i=0;
while (<CSV>){
chomp;
my @sor = split /<tr><td><;>/;
if (defined $sor[1]){
@sor = split /<\/td><>/ ,$sor[1];
my @arak = split /<\/td<>\/tr>/,$sor[3];
if(defined $sor[2]){
$sorok [$i][0]=$sor[2];
$sorok[$i][1]=$arak[0];}
$i++}
}
my $osszesites={};
my $y=0;
foreach(@sorok){
if (exists $osszesites->{sorok[$y][0]}){
$osszesites->{$sorok[$y][0]}[0] =
$osszesites->{$sorok[$y][0]}[0]+1;
$osszesites->{$sorok[$y][0]}[1]=
$ossesites->{$sorok[$y][0]}[1]+$sorok[$y][1];
}
else{
$osszesites->{$sorok[$y][0]} = ['0','0' ];
$osszesites->{$sorok[$y][0]}[0] = $osszesites->{$sorok[$y][0]}[0]+1;
$osszesites->{$sorok{$y][0]}[1] = $osszesites->{$sorok[$y][0]}[1]+$sorok[$y][1];
}
$y++
}
print '<!DOCTYPE HTML>
<html>
<head>
<style type ="text/css">
#b {font-weight:bold}
</style>
</head>
<body>
<table border=1>
<tr>
<td id="b">Gyümölcs</td> <td id="b">Darabszám</
td> <td id="b">Összár</td>
<tr>'."\n";
my $kulcs;
foreach $kulcs (keys $osszesites)
{
print "<tr>\n";
print "<td id='b'>".$kulcs."</td> 2."<td>".
$osszesites->{$kulcs}[0]."</td>"."<td>".
$osszesites->{$kulcs}[1]."</td>\n";
}
print "</table>\n</body>\n<tml>\n";
#use Data::Dumper;
#printf("%.3f", Dumper(\$osszesites));
Kezdésként (sohasem programoztam perlben):
1. Hiányzik az indentálás (tudom, a fórummotor megeszi, de erre vannak a kódmegosztó oldalak, mint a pastebin, vagy a pastie.org ).
2. A feladat bemenetként pontosvesszővel tagolt CSV állományt ad meg, te meg táblázatcellák mentén vágnál szét valamit, ha rendesen megadnád, hogy mit vágnál szét.
3. Vannak benne elütések, illetve a rendes indentálás miatti áttekinthetetlenségek (meg ugye id-t csak egy elemnek adunk, ha több elemet akarunk ugyanazzal a CSS-tulajdonsággal ellátni, akkor osztályt adunk meg; a table border attribútuma meg elavult, ott van helyette a CSS), de az összesítéses rész jó.
Szóval én valahogy így csinálnám:
Ha csak plain csv, akkor ez nem jo: my @sor = split /<tr><td><;>/;
csak igy kell: my @sor = split ";"
Itt felulirod a @sor-t: @sor = split /<\/td><>/ ,$sor[1]; (nem tudom, hogy ez tudatos-e) Meg nem tudom, hogy miert igy split-telsz.
Felesleges egyszer beolvasni a file-t es utana processzalni. Ezt meg lehet csinalni olvasas kozben. Egy ilyen hash't kell letrehozni:
hash = ( termek1 => {vasarlas = x, ertek =y},
termek2 => {vasarlas = z, ertek =w},
)
Minden alkalommal, amikor egy sort beolvasol, hozzadod a hash megfelelo ertekehez. A teljes beolvaso while loop tartalma csupan ennyi:
my ($index, $date, $item, $price) =split ";";
$hash{$item}{vasarlas} ++;
$hash{$item}{ertek} += $price;
Miutan vegeztel a file beolvasasaval nincs mas tennivalo, mint vegigmenni a hash-en es kiolvasni kiirni az osszegzett adatokat.
Na, marhára ráértem, amíg futottak a job-jaim a hálózaton, megírtam neked egy lényegesen ésszerűbb formában:
http://pastebin dot com/rURwjWUK
Majd egyszer jössz egy sörrel. :D
Privát üzenetben jött:
"Hello!Nagyon köszi a frankó megoldásodat:Dtök jó.
Lenne még egy hasonló feladat,abban is tudnál segíteni?"
Tudunk, tedd közzé a fórumban a kérdésed - a forráskód megosztására használj kódmegosztó oldalt (pastebin(pont)com, pastie.org, stb...)
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!