Avatar billede baitianlong Nybegynder
19. september 2004 - 17:22 Der er 23 kommentarer og
2 løsninger

Indsæt en hulens masse poster

Hej. Det her er i forlængelse af dette spørgsmål:

http://eksperten.dk/spm/534663

Jeg synes da det kunne være ganske sjovt at prøve, men jeg er lidt i tvivl om metoden... Hvis jeg eksporterer fra Excel til tekstfil, så  får jeg en tekstfil, der ser sådan her ud:

----------------------------------------------------------

"33996344,""33996351"",""GB"",""GBR"",""UNITED KINGDOM"""
"50331648,""69956103"",""US"",""USA"",""UNITED STATES"""
"69956104,""69956111"",""BM"",""BMU"",""BERMUDA"""
"69956112,""83886079"",""US"",""USA"",""UNITED STATES"""
"94585424,""94585439"",""SE"",""SWE"",""SWEDEN"""
"100663296,""121195295"",""US"",""USA"",""UNITED STATES"""
...og cirka 3 mb mere af samme slags
---------------------------------------------------------

De skriver på siden: http://ip-to-country.webhosting.info/node/view/280

et php script, som skulle kunne putte dataen ind i ens database. Men jeg synes scriptet er lidt underligt. Især denne linie:

for($i=1; $i $lin=explode(" ", $line[$i]);

Den vil da blive rimelig svær at få til at køre. Der mangler noget.

Hvad skal jeg gøre (find/replace) med tekstfilen, og hvilket korrekt script kan få dataen ind i databasen ?
Avatar billede baitianlong Nybegynder
19. september 2004 - 17:25 #1
Det må være noget med at fjerne nogle anførselstegn, og så explode hver linie med kommaet...
Avatar billede dennismp Nybegynder
19. september 2004 - 17:31 #2
Nu kender jeg ikke rigtig excel, men prøv evt at se på fgetcsv()
http://www.php.net/manual/en/function.fgetcsv.php

Det virker bare underligt at der er een "-sæt rundt om hele linjen.
Avatar billede dennismp Nybegynder
19. september 2004 - 17:33 #3
måske, hvis performance ikke så er interessant, så kunne man gøre det med en simpel regulært udtryk:
preg_match('!^"(\d+),""(\d+)"",""(\w{2})"",""(\w{3})"",""([^"]*)""$!', ..
Avatar billede detox Nybegynder
19. september 2004 - 17:48 #4
Ellers er det jo oplagt at bruge MySQL's 'LOAD DATA INFILE' syntax:
http://dev.mysql.com/doc/mysql/en/LOAD_DATA.html
Avatar billede baitianlong Nybegynder
19. september 2004 - 17:52 #5
Men jeg skal stadig forberede tekstfilen på en eller anden måde.

Jeg vil uploade tekstfilen, og køre et lille script, der fylder data ind i databasen
altså, den første linie i tekstfilen, skal indsætte:

ip_from = 33996344
ip_to = 33996351
country_code2 = GB
country_code3 = GBR
country_name = united kingdom

i databasen...

Kan jeg ikke "bare" fjerne alle gåseøjnene og skrive noget hen ad denne pseudokode:

åbn tekstfilen
for hver linie = $linie
list($ip_from, $ip_to, $country_code2, $country_code3, $country_name) =  explode(",", $linie);
mysql_query("INSERT INTO iptocountry(ip_from, ip_to, country_code2, country_code3, country_name VALUES($ip_from, $ip_to, $country_code2, $country_code3, $country_name)");

Det må da være måden at gøre det på, men jeg er ikke helt sikker på resten (fopen og sådan noget). Er der en, der gider hjælpe med at skrive det :)
Avatar billede baitianlong Nybegynder
19. september 2004 - 18:08 #6
Jeg har lige prøvet en miniversion af tekstfilen, som jeg ændrede til at se sådan her ud:

33996344,33996351,GB,GBR,UNITED KINGDOM
50331648,69956103,US,USA,UNITED STATES
69956104,69956111,BM,BMU,BERMUDA
69956112,83886079,US,USA,UNITED STATES
94585424,94585439,SE,SWE,SWEDEN
100663296,121195295,US,USA,UNITED STATES
121195296,121195327,IT,ITA,ITALY

og dette script:

<?php

$mysql_host = 'localhost';
$mysql_username = 'xxxxxxxxxxxxxxxxx';
$mysql_password = 'xxxxxxxxxxxxxxxxx';
$mysql_dbName = 'legende_dk';
$dbh = mysql_connect("$mysql_host", "$mysql_username", "$mysql_password");
mysql_select_db("$mysql_dbName");

$fl="ip.txt";
$fp=fopen($fl, "r");
$fr=fread($fp, filesize($fl));
$line = explode("\n", $fr);
$fno = 0;
foreach($line as $linie) {
    list($ip_from, $ip_to, $country_code2, $country_code3, $country_name) =  explode(",", $linie);
    mysql_query("INSERT INTO iptocountry(ip_from, ip_to, country_code2, country_code3, country_name VALUES($ip_from, $ip_to, $country_code2, $country_code3, $country_name)");
    print("Post indsat".$country_name);
}

mysql_close($dbh);
?>

Den skrev fint nok:

Post indsatUNITED KINGDOM Post indsatUNITED STATES Post indsatBERMUDA Post indsatUNITED STATES Post indsatSWEDEN Post indsatUNITED STATES Post indsatITALY

Men databasen er stadig tom ? Hvorfor ?
Avatar billede dennismp Nybegynder
19. september 2004 - 18:10 #7
prøv med:
mysql_query("INSERT INTO iptocountry(ip_from, ip_to, country_code2, country_code3, country_name VALUES('$ip_from', '$ip_to', '$country_code2', '$country_code3', '$country_name')") or die(mysql_error());
Avatar billede baitianlong Nybegynder
19. september 2004 - 18:14 #8
Nu så jeg lige den parantes slut, der manglede (og apostrof'erne manglede også)
Avatar billede baitianlong Nybegynder
19. september 2004 - 18:17 #9
Det virker glimrende... Så jeg fik den nærmest løst selv :) men lige et sidste spørgsmål

Jeg skal checke det med noget hen ad:

SELECT country_name FROM iptocountry WHERE IP_FROM <= $ipnumber and IP_TO >= $ipnumber

Men posterne er varchars... Kan man "regne med dem" altså >= <= ??
Avatar billede dennismp Nybegynder
19. september 2004 - 18:27 #10
Du kan jo konverterer ip'erne til et tal istedet - så kan du lave dette. Men giver det altid mening at

192.x.y.z > 168.x.y.z ?
Avatar billede baitianlong Nybegynder
19. september 2004 - 18:31 #11
Nej nej, men det er der taget højde for. IP'erne ligger med IPNUMBER i stedet for xxx.xxx.xxx.xxx Der er sådan nogle smukke funktioner her:

$ip_number = sprintf("%u", ip2long($dotted_ip_address));
$dotted_ip_address = long2ip($ip_number);
Avatar billede dennismp Nybegynder
19. september 2004 - 18:45 #12
Ok - så forstår jeg ikke dit spørgsmål :). Hvis du har gemt dem som numre, hvrofor bruger du så varchar?
Avatar billede baitianlong Nybegynder
19. september 2004 - 18:50 #13
aner det ikke ?! Det står der her:

http://ip-to-country.webhosting.info/node/view/280

Jeg kan bare ændre dem til LONG så. Der er lige en lille ting mere. Så er det smukt.

Jeg satte min notebook til at ændre alle " til ingenting, men det tager den hele livet, og den går lidt kold i det... Derfor vill jeg gøre det i scriptet v.hj.a.

preg_replace("\"", "", $linie);

Men det virker ikke. Hvad skal man så skrive ?
Avatar billede dennismp Nybegynder
19. september 2004 - 18:58 #14
$linie = str_replace('"','',$linie); // lidt hurtigerer
Avatar billede baitianlong Nybegynder
19. september 2004 - 18:59 #15
str_replace("\"", "", $linie);

den virker heller ikke ?!?! Det er da underligt
Avatar billede baitianlong Nybegynder
19. september 2004 - 19:02 #16
Den fjerner ikke de ", som den skal... Jeg har nu:

foreach($line as $linie) {
    str_replace('"', '', $linie);
    print $linie;
    list($ip_from, $ip_to, $country_code2, $country_code3, $country_name) =  explode(",", $linie);
    mysql_query("INSERT INTO iptocountry(ip_from, ip_to, country_code2, country_code3, country_name) VALUES('$ip_from', '$ip_to', '$country_code2', '$country_code3', '$country_name')") or die(mysql_error());
    print("Post indsat".$country_name);
}

og outputtet på siden er:

"33996344,""33996351"",""GB"",""GBR"",""UNITED KINGDOM""" Post indsat""UNITED KINGDOM""" "50331648,""69956103"",""US"",""USA"",""UNITED STATES""" Post indsat""UNITED STATES""" "69956104,""69956111"",""BM"",""BMU"",""BERMUDA""" Post indsat""BERMUDA""" "69956112,""83886079"",""US"",""USA"",""UNITED STATES""" Post indsat""UNITED STATES""" "94585424,""94585439"",""SE"",""SWE"",""SWEDEN""" Post indsat""SWEDEN"""
Avatar billede dennismp Nybegynder
19. september 2004 - 19:04 #17
du skal skrive
$linie = str_replace('"', '', $linie);
ikke
str_replace('"', '', $linie);

:-)
Avatar billede baitianlong Nybegynder
19. september 2004 - 19:08 #18
Det fandt jeg ud af :)

Sidste spørgsmål og kronen på værket. Jeg ændrede Varchar til FLOAT, men nu står der f.eks: 3.39963e+07 i stedet for 33996344. Det er jo ikke præcist nok. Kan jeg bruge BIGINT, eller hvad skal jeg bruge ?
Avatar billede baitianlong Nybegynder
19. september 2004 - 19:12 #19
Fandt den her SQL BigInt Max Value = 18446744073709551615

Det må være nok :)


Tak for din hjælp. Smid et svar dennismp :)
Avatar billede detox Nybegynder
19. september 2004 - 19:20 #20
En alm. INT (evt, UNSIGNED) er nu osse stor nok.
Avatar billede dennismp Nybegynder
19. september 2004 - 19:30 #21
Lad vær' med at give mig fuld points. Du har jo fundet ud af det meste selv :)
Avatar billede baitianlong Nybegynder
19. september 2004 - 20:30 #22
Det er for sindssygt. Når jeg afvikler min side på mit webhotel, bliver den rimeligt sur. Det er nok fordi der er rimeligt meget data.

Jeg prøvede at åbne tekstfilen i Word, og den fylder 904 sider. Det er jo en del.

Jeg vil prøve at dele den op i 5-10 mindre filer og se hvad serveren siger til det.

Egentlig kan jeg jo være ligeglad med om folk kommer fra Burma eller Singapore, men nu er jeg jo fastsat på dette sære projekt. Så serveren og databasen har bare at arbejde lidt :))

Jeg deler pointsne med dig dennismp, og håber det er fint.
Avatar billede baitianlong Nybegynder
19. september 2004 - 20:31 #23
Sådan der 61.5 point - ha ha :) sjovt nok
Avatar billede dennismp Nybegynder
19. september 2004 - 20:45 #24
Er det et forsøg på at finde ud af, hvor folk kommer fra?
Avatar billede dennismp Nybegynder
19. september 2004 - 20:45 #25
.. og tak :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester