Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Re^9: Hash of Hashes from file

by Cristoforo (Deacon)
on Apr 14, 2012 at 14:54 UTC ( #965068=note: print w/ replies, xml ) Need Help??


in reply to Re^8: Hash of Hashes from file
in thread Hash of Hashes from file

Hi

I thought I'd post a database solution. Its not really necessary as the Perl code solution works. The advantage of loading into a database is if your file is too large to fit in memory. Also, if you wanted to see different views of the data, it would be probably easier to write an SQL query than to write another program, etc.

I can't vouch for the SQL here - I don't use it often, but it did produce the results similiar to the Perl program above.

You could run it if you had the DBI and DBD::SQLite modules on your system.

The first program creates the database and the second program runs the queries.

#!/usr/bin/perl use strict; use warnings; use DBI; my $dbh = DBI->connect("dbi:SQLite:dbname=users.lite","","", {PrintError => 1, AutoCommit => 0}) or die "Can't connect"; $dbh->do('DROP TABLE users'); $dbh->do(qq{ CREATE TABLE users (user TEXT, site TEXT, type TEXT) }); my $sql_fmt = "INSERT INTO users VALUES(?,?,?)"; while(<DATA>) { $dbh->do($sql_fmt, {}, /"([^"]+)"/g); $dbh->commit if $. % 1_000_000 == 0; # commit every 1,000,000 } $dbh->commit; $dbh->disconnect; __DATA__ user="john" website="www.yahoo.com" type="Entertainment" user="john" website="www.yahoo.com" type="Entertainment" user="john" website="www.yahoo.com" type="Entertainment" user="david" website="www.facebook.com" type="Social Networking" user="john" website="www.facebook.com" type="Social Networking" user="mike" website="www.google.com" type="Search Engines"
#!/usr/bin/perl use strict; use warnings; use DBI; my $dbh = DBI->connect("dbi:SQLite:dbname=users.lite","","", {PrintError => 1, AutoCommit => 0}) or die "Can't connect"; # Prepare and print list of all websites to every user my $sth = $dbh->prepare(<<SQL); SELECT * FROM users ORDER BY user, site SQL $sth->execute; while(my @row = $sth->fetchrow_array) { printf "%-15s%-20s%s\n", @row; } print "\n"; # Create list of users from most visits to least for @users array $sth = $dbh->prepare(<<SQL); SELECT user, COUNT(user) Count FROM users GROUP BY user ORDER BY Count DESC, user SQL $sth->execute; my @users; while(my @row = $sth->fetchrow_array) { push @users, $row[0]; } # Counts for each website and counts of categories visited by user for my $user (@users) { $sth = $dbh->prepare(qq{SELECT site, COUNT(site) Count FROM users WHERE user = '$user' GROUP BY site ORDER BY Count DESC }); $sth->execute; printf "Name: %s\n\t%-20s%s\n", $user, qw/ Website Count /; while(my @row = $sth->fetchrow_array) { printf "\t%-20s%s\n", @row; } print "\n"; printf "\t%-20s%s\n", qw/ Category Count /; $sth = $dbh->prepare(qq{SELECT type, COUNT(type) Count FROM users WHERE user = '$user' GROUP BY type ORDER BY Count DESC }); $sth->execute; while(my @row = $sth->fetchrow_array) { printf "\t%-20s%s\n", @row; } print "\n"; } $dbh->disconnect;

Chris

Update: Re-wrote the query in loop of '@users'.


Comment on Re^9: Hash of Hashes from file
Select or Download Code

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://965068]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others musing on the Monastery: (11)
As of 2014-10-20 10:52 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    For retirement, I am banking on:










    Results (75 votes), past polls