Thread DBI - Speichern von Daten - Anfängerfrage
(9 answers)
Opened by lin at 2010-10-16 22:43 Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 #!/usr/bin/perl use strict; # alles muss definiert sein use warnings; # wenn etwas nicht so ganz richtig ist warnen use diagnostics; # wenn etwas nicht passt ist warnen use File::Find::Rule; # finde Dateien/Verzeichnisse anhand von Regeln use HTML::TokeParser; # parse HTML-Dateien zum leichten auslesen von Daten use DBI; # Das Verzeichnis im dem gesucht werden soll my $search_dir='.'; # ist das aktuelle Arbeitsverzeichnis # die mötigen Werte um dich mit einer Datenbank zu verbinden # ist im Modul alles sehr ausführlich beschrieben # die angefügten Werte sind nur Platzhalter!!! my $dsn="..."; my $user="XXX"; my $password="???"; my $sql_insert = q{ insert into school_tbl (location, name, type, address, description) values (?, ?, ?, ?, ?) }; # Suche nach bestimmten Dateinamen my @files= File::Find::Rule->file() # suche eine Datei ->name('einzelergebnis*.html') # die mit "einzelergebnis" (alles klein geschieben!) beginnt und mit ".html" endet ->in($search_dir); # suche in dem Verzeichnis # das Programm beenden wenn keine Dateien gefunden wurden: unless(@files) { print "Keine Dateien gefunden!\n"; exit; } # mit dem Server verbinden # wie das genau geht steht in der Dokumentation von DBI my $dbh = DBI->connect($dsn, $user, $password, { RaiseError => 1 }) or die($DBI::errstr); my $sth = $dbh->prepare($sql_insert); #gehe alle gefundenen Dateien durch for my $file (@files) { # Ausgabe, damit man weiß waw passiert. print "Bearbeite nun datei: $file!\n"; # Speichrort für die Schuldaten in dieser Datei my %school; # starte seine neue Parser-Instanz mit der Datei als Quelle my $p = HTML::TokeParser->new($file) or die "Can't open $file: ($!)"; #solange ein Tag von Typ 'div' gefunden wird while (my $tag = $p->get_tag('div', '/html')) { # first move to the right div that contains the information last if $tag->[0] eq '/html'; next unless exists $tag->[1]{'id'} and $tag->[1]{'id'} eq 'inhalt_large'; $p->get_tag('h1'); $school{'location'} = $p->get_text('/h1'); while (my $tag = $p->get_tag('div')) { last if exists $tag->[1]{'id'} and $tag->[1]{'id'} eq 'fusszeile'; # get the school name from the heading next unless exists $tag->[1]{'class'} and $tag->[1]{'class'} eq 'fm_linkeSpalte'; $p->get_tag('h2'); $school{'name'} = $p->get_text('/h2'); # verify format for school type $tag = $p->get_tag('span'); unless (exists $tag->[1]{'class'} and $tag->[1]{'class'} eq 'schulart_text') { warn "unexpected format: parsing stopped"; last; } $school{'type'} = $p->get_text('/span'); # verify format for address $tag = $p->get_tag('p'); unless (exists $tag->[1]{'class'} and $tag->[1]{'class'} eq 'einzel_text') { warn "unexpected format: parsing stopped"; last; } $school{'address'} = clean_address($p->get_text('/p')); # find the description $tag = $p->get_tag('p'); $school{'description'} = $p->get_text('/p'); } } # speichere alle gefunden Werte in der DB # das @hash{...} ist ein "HashSlice" $sth->execute(@school{qw{location name type address description}}); } $sth->finish(); $dbh->disconnect(); Aber mal ehrlich, was ist so schwer die beiden Codeteile zusammen zu fügen? Mich interessiert es wirklich welche Hürde nicht zu überwinden war. In deinem (möglicherweise an anderer Stelle erfragten Code) steht: # Bei jedem Durchgang dann: Das ist doch eine Anleitung oder zumindest ein Hinweis. Es fällt mir sehr schwer zu verstehen, wo dabei das Problem war. Die einzelnen Funktionen sind sehr genau in DBI beschrieben. Daraus ließe sich ermitteln, wo im Programmcode diese Platziert werden müssten um korrekt zu funktionieren. Möglicherweise habe ich einen zu großen Abstand zu einem Anfänger, aber ich denke der Begriff "Durchgang" sollte im Zusammenhang mit dem Programmcode, der eine große Schleife hat, die durchlaufen wird, klar sein was gemeint ist. Auch das wo sollte dabei ersichtlich sein, da man die Daten erst in die DB einfügen kann, wenn sie aus dem HTML ausgelesen wurden. Zumindest erwarte ich so etwas bei jemanden, der sagt er beherrsche SQL. Sollte dieses Verständnis nicht vorhanden sein, so Empfehle ich dringend sich dieses absolut nötige Wissen anzueignen, denn ohne das kann man kaum erwarten eine Programmiersprache zu erlernen, oder Programme zu schreiben. Last edited: 2010-10-17 03:48:03 +0200 (CEST) |