Thread DBI - Speichern von Daten - Anfängerfrage (9 answers)
Opened by lin at 2010-10-16 22:43

topeg
 2010-10-17 03:45
#141986 #141986
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
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 CPAN: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)

View full thread DBI - Speichern von Daten - Anfängerfrage