grupiranje csv , python ili perl

Poslao bilbdonraa on 07.09.2010 16:20:02
ehlo :)

u python-u ili perl - u

imam jedan 'problemcic' .
nikako da provirim izvan kutije , ne znam ni sto bih vise upisivao u google
imam .csv dokument tipa:
A;B;C
------
1;trt;2
1;rt;2
1;rtd;2
1;ert;2
2;xd;1
2;xd;1
2;xd;1
3;45;3
3;46;3
3;tz;3


kako grupirati sve sto u koloni A ima vrijednost '1' i zbrojiti pripadajuci C ? tako da npr za 1 dobijem krajnu vrijednost 8
1=8
2=3
3=9

rjesenje koje sada imam je -> prolazim kroz linije i na osnovi prve kolone radim textualne dokumente u koje sam onda >> upisivao vriijednost te onda tu vrijednost ocitao iz tog textualnog dokumenta i zbrojio.
mislim da je to 'malo' zbrljano rjesenje pogotovo sto moram proci kroz , pa puno linija.
kako to 'potrpati' u memoriju i onda raditi sa tim ?
unaprijed hvala

Re: grupiranje csv , python ili perl

Poslao ravilov on 07.09.2010 16:34:38
Radiš... dokumente?!
Kao, baš prave fizičke datoteke na disku?
Šališ se?
A i jedan i drugi jezik imaju toliko mnogo tako divnih memorijskih struktura...

Evo otprilike kako bi to ja, u perl-u:
#! /usr/bin/perl -w
use strict;
# preskoci prva dva retka
my $dummy = <STDIN>;
$dummy = <STDIN>;
my %data = ();
while (<STDIN>) {
    s{[\r\n]+$}{}g;
    my ($a, $b, $c) = split(/;/, $_);
    $data{$a} = 0 unless defined($data{$a});
    $data{$a} += $c;
}
foreach (sort(keys(%data))) {
    print STDOUT sprintf('%d=%d', $_, $data{$_})."\n";
}


BTW, prilično mi je nevjerojatno da za nešto ovako banalno i trivijalno nema već barem 1000 tutoriala i objašnjenja na netu...

Re: grupiranje csv , python ili perl

Poslao igustin on 07.09.2010 16:53:26
Evo ti varijanta rješenja s AWK onelinerom:

awk 'BEGIN {FS=";"} {if(NR>2) t[$1]+=$3} END {for(x in t) print x "=" t[x]}' < podaci


...gdje je 'podaci' datoteka s podacima kakve si naveo.

Re: grupiranje csv , python ili perl

Poslao bilbdonraa on 09.09.2010 11:04:36
hvala na odgovorima .
do sada sam dosao do tu
ali cini se da je ovo ok samo za pronalazenje duplikata :), barem nesto.
nikako ne mogu shvatiti kako ocitati broj i zbrojiti ga sa sljedećim.
kada pogledam ovu liniju u AWK-u place mi se, tako je jednostavno i djelotvorno, savrseno ,ali ne mogu to prevesti u python :(
gdje grijesim?

u ovom slucaju radi se o 'text' dokumetu tipa
1
2
3
4
5
6
7
8


#!/usr/bin/python

fh = open("text")
lista= fh.readlines()
fh.close
lines = [lines[:-1] for lines in lista]
lines2=[int(i) for i in lines]

###############################
total=0
y=''
for x in lines2:
	if x==y:
		print y
		total += x
	y=x
print total


Re: grupiranje csv , python ili perl

Poslao ravilov on 09.09.2010 23:02:05
Još uvijek tvrdim da postoji čitava armada tutoriala za ovo, po cijelom internetu... Kreni odavde: http://www.google.com/

Anyway, ja ti čini mi se više ne mogu pomoći, jerbo ne govorim python baš tečno...

Re: grupiranje csv , python ili perl

Poslao igustin on 09.09.2010 23:20:27
Ni ja ne pričam Python dovoljno tečno, pa ti preporučam da probaš i na razmjena.org, tamo provjereno ima Pythonovaca.

Re: grupiranje csv , python ili perl

Poslao bilbdonraa on 10.09.2010 9:24:11
a nesto sam kao uspio skrpati izgleda gore od frankenstein-a ali radi. mislim , vjerojatno postoji mnogo elegantnije rjesenje ali za pocetak ce i ovo biti ok.
hvala na usmjeravanju.
so long, and thanks for all the fish ;)

#!/usr/bin/python

fh = open("text")
lista= fh.readlines()
fh.close
lines = [lines[:-1] for lines in lista]
lines2=[int(i) for i in lines]

###############################
total=0
y=''
count=1
for x in lines2:
	if x==y:
		count+=1
		total=count*x
		
	else:
		count=1
		if total==0:
			2+2
		else:
			print total
		total=0
	y=x
if total==0:
	2+2
else:
	print total


Re: grupiranje csv , python ili perl

Poslao ravilov on 10.09.2010 16:41:08
Savjet za sljedeći put: kad postaš kôd ovdje na forum, preporučljivo ga je staviti između [code] i [/code] tagova, onda se očuva formatiranje i sve skupa bolje izgleda.

Što se tiče tvoje skripte, najzanimljivi mi je ovaj dio:
if total==0:
	2+2


Čemu to? Ne znam baš dobro python, ali ovo "2+2" se čini totalno beskorisno i bespotrebno... Što nije bilo lakše reći "if total != 0:", bez "else"?

Re: grupiranje csv , python ili perl

Poslao bilbdonraa on 12.09.2010 13:37:39
napokon nesto konkretno ,tako da zatvorim ovaj topic, no ako netko vidi 2+2 (tnx ravilov,ne znam sto mi bi)neka javi :)

#!/usr/bin/python
###########
file='lista2'
a = open(file)
b = a.readlines()
a.close
b.sort()
c = [c[:-1] for c in b]
d=len(b)
e=0
aak=0
tot=0
###########
grupsum = open('sortirano', 'w')
while d>e:
	bbkv=c[e].split(';')
	if bbkv[0]!='':
		intbbkv=int(bbkv[1])
		if aak and bbkv[0] != aak:
			grupsum.write(aak+'='+str(tot)+'\n')
			print aak+'='+str(tot)
			tot=0
		aak=bbkv[0]
		tot+=intbbkv
	e+=1
	if d==e:
		print aak+'='+str(tot)
		grupsum.write(aak+'='+str(tot)+'\n') 

grupsum.close() 


kljuc je
if aak and bbkv[0] != aak:
i stvarno net je prepun tutoriala za ovakve slucajeve ako znas sto trazis :)
jedan od linkova

hvala jos jednom

Ova poruka je od: http://www.linux.hr/newbb/viewtopic.php?forum=8&topic_id=2355