PHP.EE FOORUM   
Nimi:   Pass:   Mäleta mind! 
   Teemad | php.ee esilehele | registreeri | Märgi kõik teemad loetuks | #php.ee Skype vestlus | RSS
UUS TEEMA  OTSI  Lehekülgi: 1
kuidas konverteerida CSV binaarseks .dat formaati
Postitaja: trina 2005-02-17 17:44:02
Alljärgnev programm viskas millegi pärast peale andmete läbikammimist errori
Traceback (most recent call last):
File "makedb.py", line 123, in ?
File "makedb.py", line 95, in readFile
UnboundLocalError: local variable 'max' referenced before assignment


http://weirdsilence.net/86#winmaker
Download: http://weirdsilence.net/100


ja makedb.py sorts on:


from struct import pack, calcsize

def long2ip( longip ):
b4 = ( longip >> 24 ) & 255
b3 = ( longip >> 16 ) & 255
b2 = ( longip >> 8 ) & 255
b1 = longip & 255
return ( b4, b3, b2, b1 )

def readfile( filename, isGeo ):
f = file( filename, 'r' )
lines = f.readlines()
f.close()

f = file( 'ip2cntry.dat', 'wb+' )
# Write magic
f.write( 'ip2c' )
# Reserve index position
f.write( pack( '<i', 0 ) )

min = None
countries = []
cnt = 0
topidx = {}
minip = 0
maxip = 0
for line in lines:
cnt += 1
try:
line = line.replace( '"', '' )
if isGeo:
tmp, tmp, start, end, two, tmp = line.split( ',', 5 )
else:
# The CSV is start,end,twochar,threechar,country name
# We don't use threechar and country
start, end, two, tmp, tmp = line.split( ',', 4 )
start = long( start )
end = long( end )
if two not in countries:
# New country
countries.append( two )
countryidx = countries.index( two )
# Write record
f.write( pack( '<LLH', start, end, countryidx ) )

# Check out the A class
aclassStart, tmp, tmp, tmp = long2ip( start )
aclassEnd, tmp, tmp, tmp = long2ip( end )
for i in range( aclassStart, aclassEnd + 1 ):
if i not in topidx:
# This is an A class we don't have yet
# Give it the current record number
topidx[ i ] = cnt
if min is None:
# Smallest IP and A class
min = start
minip = aclassStart

# Max IP and A class
max = end
maxip = aclassEnd
except ValueError:
# Hmm some error, print the line
print line
cnt -= 1
if cnt % 15000 == 0:
print "Please wait..."
# We're done, get position of end - Where to begin the index
idx = f.tell()
# Write index
f.write( pack( '<LLLBH', cnt, min, max, calcsize( '<LLH' ), len( countries ) ) )
# Write country codes
for country in countries:
f.write( country )
# Write smallest and largest A class
f.write( pack( '<BB', minip, maxip ) )
lastpos = 0
for i in range( minip, maxip + 1 ):
# Write record positions of all A classes
if i in topidx:
pos = topidx[ i ]
lastpos = pos
else:
pos = -lastpos
f.write( pack( '<l', pos ) )
# Update the file header and record the position of our index
f.seek( 4 )
f.write( pack( '<i', idx ) )
f.close()
# Done!
print cnt, "records. Countries:", len( countries ), "Min:", min, "Max:", max
print "A class ", minip, "-", maxip

if __name__ == '__main__':
from sys import argv
if len( argv ) == 2 and argv[ 1 ] != '-g':
readfile( argv[ 1 ], False )
elif len( argv ) == 3:
readfile( argv[2], True )
else:
print "makedb.py [-g] csvfile"
print " -g specifies GeoIP Free CSV"
print ""
print "Get the latest IP-to-Country CSV file from here:"
print " http://ip-to-country.webhosting.info/downloads/ip-to-country
print ""
print "Get the latest GeoIP CSV file from here:"
print " http://www.maxmind.com/download/geoip/database/GeoIPCountryC
print ""



Või teab keegi muud programmi või nippi, kuidas konverteerida CSV .dat formaat?
RE: kuidas konverteerida CSV binaarseks .dat formaati
Postitaja: er 2005-02-17 18:05:40
kes on ".dat"-formaat?
RE: kuidas konverteerida CSV binaarseks .dat formaati
Postitaja: trina 2005-02-17 19:04:18
CSV-st binaarseks noh
RE: kuidas konverteerida CSV binaarseks .dat formaati
Postitaja: tre 2005-02-17 21:02:04
Kes asi on CSV?
RE: kuidas konverteerida CSV binaarseks .dat formaati
Postitaja: muidumeez 2005-02-18 09:14:20
Ja Python != PHP ...
RE: kuidas konverteerida CSV binaarseks .dat formaati
Postitaja: er 2005-02-18 10:12:15
TSITEERITUD:
CSV-st binaarseks noh
Ehk oled nii lahke ja kirjeldad mulle seda binaarfaili? Ja siis võiksid ka selgitada, miks CSV ei ole binaarfail?
RE: kuidas konverteerida CSV binaarseks .dat formaati
Postitaja: lk 2005-02-18 10:34:03
RE: kuidas konverteerida CSV binaarseks .dat formaati
Postitaja: trina 2005-02-18 11:45:23
See tasuta variant on vana versioon aga mul on jaanuari lõpuga andmed.
RE: kuidas konverteerida CSV binaarseks .dat formaati
Postitaja: er 2005-02-18 21:44:50
Ei tea küll, mis sind sinna dat-faili poole tõmbab. Mina tegin nii:

1) tirisin faili:
http://ip-to-country.webhosting.info/downloads/ip-to-country

2) pakkisin lahti:
unzip ip-to-country.csv.zip

3) tegin andmebaasi tabeli:
CREATE TABLE ip_to_country(start_ip INT UNSIGNED NOT NULL, end_ip INT UNSIGNED NOT NULL, code2 CHAR(2) NOT NULL, code3 CHAR(3) NOT NULL, country VARCHAR(64) NOT NULL, PRIMARY KEY(start_ip, end_ip));

4) kopeerisin faili sisu tabelisse:
LOAD DATA LOCAL INFILE 'ip-to-country.csv' INTO TABLE ip_to_country FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n';

5) tegin pulli pärast päringu:
SELECT INET_NTOA(start_ip) AS start_ip, INET_NTOA(end_ip) AS end_ip, code2, code3, country FROM ip_to_country WHERE INET_ATON('80.235.10.10') BETWEEN start_ip AND end_ip;

RE: kuidas konverteerida CSV binaarseks .dat formaati
Postitaja: er 2005-02-18 22:33:08
proovime ka ridade vahelt lugeda:
SELECT INET_NTOA(start_ip) AS start_ip, INET_NTOA(end_ip) AS end_ip, INET_NTOA(INET_ATON('255.255.255.255') - (start_ip ^ end_ip)) AS mask, code2, code3, country FROM ip_to_country WHERE INET_ATON('80.235.10.10') BETWEEN start_ip AND end_ip;
RE: kuidas konverteerida CSV binaarseks .dat formaati
Postitaja: er 2005-02-19 00:47:47
Ja kui me tahaksime kohe eriti palju infot kätte saada, siis:

SELECT @host AS ip, INET_NTOA(start_ip) AS network, INET_NTOA(end_ip) AS broadcast, INET_NTOA(@mask := (INET_ATON('255.255.255.255') - (@wildcard := (start_ip ^ end_ip)))) AS netmask, INET_NTOA(@wildcard) AS wildcard, POW(2, 32 - BIT_COUNT(@mask)) - 2 AS hosts, CHAR(65 + (CASE WHEN (start_ip >> 27 = 30) THEN 4 WHEN (start_ip >> 28 = 14) THEN 3 WHEN (start_ip >> 29 = 6) THEN 2 WHEN (start_ip >> 30 = 2) THEN 1 WHEN (start_ip >> 31 = 0) THEN 0 ELSE NULL END)) AS class, code2, code3,country FROM ip_to_country WHERE INET_ATON(@host := '80.235.10.10') BETWEEN start_ip AND end_ip;
RE: kuidas konverteerida CSV binaarseks .dat formaati
Postitaja: trina 2005-02-19 11:08:13
mul on mysql variant töös aga on palju kordi aeglasem kui binaarsena (ligi 50x)
RE: kuidas konverteerida CSV binaarseks .dat formaati
Postitaja: lk 2005-02-19 12:44:49
Mul tegi selle konvertimise ilma veateadeta:

http://zone.ee/dev/null/ip2cntry.rar
RE: kuidas konverteerida CSV binaarseks .dat formaati
Postitaja: trina 2005-02-19 13:06:36
Mis op süsteem sul on, et sul veateadet ei löönud?
Ja kas tegid selle konverteerimise algfailist mis on saadaval http://ip-to-country.webhosting.info/
RE: kuidas konverteerida CSV binaarseks .dat formaati
Postitaja: lk 2005-02-19 13:52:14
Opsys on xp aga võibolla oli asi selles, et mul oli ka python masinasse installitud.

Konvertimiseks kasutasin seda faili
http://ip-to-country.webhosting.info/downloads/ip-to-country
RE: kuidas konverteerida CSV binaarseks .dat formaati
Postitaja: trina 2005-02-19 14:14:50
Mul Win98SE ja installisin ka Python-i aga kuna seda kasutada ei osanud võib olla seetõttu ka polnud selle installimisest kasu.

Igatahes tänan, et selle ära konverteerisid ja üles panid.

Leheküljed: 1

©2002-2013 Martin Rebane & PHP.ee kaasautorid
  0.0853559970856