ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/dinfo/dinfo.pm
Revision: 1.1
Committed: Mon Aug 25 00:07:25 2003 UTC (23 years, 1 month ago) by root
Branch: MAIN
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 package dinfo;
2    
3     use Carp;
4    
5     use PApp::SQL;
6    
7     # 2031616: 0:435514 1:44163 2:107528 3:127671 4:8311 5:2028604 6:117468 7:8210 8:11754 9:24860 14:4344
8     # 4128768: 0:650846 1:92556 2:183027 3:170894 4:8605 5:4122242 6:147178 7:8238 8:11802 9:31453 14:6460
9    
10     sub new {
11     my ($class, $dsn, $user, $pass) = @_;
12    
13     my $self = bless {
14     dbh => (PApp::SQL::connect_cached "dinfo::", $dsn, $user, $pass),
15     }, $class;
16    
17     $self;
18     }
19    
20     my @cvtid = (
21     [name => 0],
22     [vorname => 1],
23     [zusatz1 => 2],
24     [zusatz2 => 3],
25     [zusatz3 => 4],
26     [vorwahl => 5],
27     # nummer
28     [strasse => 7],
29     [haus => 8],
30     [plz => 9],
31     [ort => 10],
32     #[ort => 10], # Ortsteil
33     [branche => 11],
34     [typ => 12],
35     );
36    
37     sub import {
38     my ($self, $path) = @_;
39    
40     local $PApp::SQL::DBH = $self->{dbh};
41    
42     my @sql;
43     my $flush_sql = sub {
44     sql_exec "insert into row values " . (join ", ", ("(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)") x @sql),
45     map @$_, @sql;
46     @sql = ();
47     };
48    
49     sql_exec "truncate $_"
50     for qw(branche haus name ort plz row strasse typ vorname vorwahl zusatz1 zusatz2 zusatz3);
51    
52     sql_exec "lock tables " . join ", ", map "$_ write",
53     qw(branche haus name ort plz row strasse typ vorname vorwahl zusatz1 zusatz2 zusatz3);
54    
55     open my $fh, "<", $path
56     or croak "$path: $!";
57    
58     while (<$fh>) {
59     chomp;
60     my @data = split /\t/;
61    
62     $data[3] =~ s/^, //;
63     $data[7] =~ s/\.$// && $data[6] =~ s/ Geb$/Geb./;
64    
65     $data[6] =~ /^((?:[a-zA-Z][-.\/a-zA-Z0-9]*)?) (?:\s*\+)? \s* ([0-9\ ]+)$/x or do {
66     warn "ERR: unparseable telnr. '$data[6]'";
67     next;
68     };
69    
70     $data[6] = $2;
71     $data[12] = $1;
72    
73     ($data[5] eq substr $data[6], 0, length $data[5])
74     and substr $data[6], 0, length $data[5], "";
75    
76     if (length $data[6] > 12) {
77     warn "ERR: number too long '$data[6]'";
78     next;
79     }
80    
81     for (@cvtid) {
82     my ($name, $idx) = @$_;
83     $data[$idx] = ($cache[$idx]{$data[$idx]}
84     ||= sql_insertid sql_exec
85     "insert into $name (id, data) values (NULL, ?)", "$data[$idx]");
86     }
87    
88     $data[12] < 16 or die "ERR: too many typ's";
89    
90     $data[6] =~ s/ //g;
91     $data[6] = pack "H*", (substr "$data[6]000000000", 0, 12) . sprintf "%x%x", 12 - length $data[6], $data[12];
92     #warn unpack "H*", $data[6];
93    
94     #name vorname zusatz1 zusatz2 zusatz3 vorwahl nummer strasse haus plz ort branche
95    
96     push @sql, [
97     $data[0], $data[1], $data[2], $data[3], $data[4],
98     $data[5], $data[6],
99     $data[7], $data[8], $data[9], $data[10], $data[11],
100     ];
101    
102     &$flush_sql if @sql > 1000;
103    
104     $count++ & 4095 or warn time . " $count";
105    
106     if (0) {
107     $freq[$_]{$data[$_]}++ for (0..9, 14);
108    
109     unless (++$x & 65535) {
110     print "$x: ";
111     for (0..9, 14) {
112     print "$_:".(scalar keys %{$freq[$_]})." ";
113     }
114     print "\n";
115     }
116     }
117     }
118    
119     &$flush_sql if @sql;
120     }
121    
122     my $db = new dinfo "DBI:mysql:dinfo";
123    
124     $db->import("main.tsv");
125