Avatar billede dmg Nybegynder
04. juni 2004 - 13:46 Der er 32 kommentarer og
1 løsning

Udtræk fra fil til mysql

Hej eksperter.

Jeg modtager ugenligt en lang fil med nedenstående data.

Denne fil ville jeg meget gerne via et php script kunne indsætte en min mysql database.

Men det er jo ikke lige til. Kan man evt bruge php til at formater det og evt kaste det ind i mysql?

Jeg er villig til at afgive flere points :-)

1;10;3030634;27.02.04;30.03.04;05.04.04
2;1;3632;882;2102919805;;;08.03.04;19.11.03;101,00;
2;2;3646;210;2103088874;;;25.03.04;15.12.03;63,00;0,00
2;3;3627;1981;2103089083;;;02.03.04;06.01.04;215,00;
2;4;3626;1004;2103089124;;;01.03.04;08.01.04;86,00;0,00
2;5;3625;1106;2103089191;;;27.02.04;12.01.04;128,00;0,00
2;6;3625;1304;2103159408;;;27.02.04;19.01.04;382,00;0,00
2;7;3634;1667;2103159450;;;09.03.04;21.01.04;35,00;
2;8;3634;2147;2103159453;;;09.03.04;21.01.04;44,00;
Avatar billede riversen Nybegynder
04. juni 2004 - 13:48 #1
Hvorfor er det ikke lige til?
Avatar billede lobster Nybegynder
04. juni 2004 - 13:49 #2
Ja du kan bare lave et script som åbner filen, læser værdierne ind i f.eks et array også videre ned i mysql.
Jeg lavede noget lignede for noget tid siden.
Avatar billede dennismp Nybegynder
04. juni 2004 - 13:56 #3
$fp = fopen('fil.txt','r');
if( $fp ) {
  while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
 
    $sql = "INSERT INTO tabel (c1,c2,c3) VALUES('$data[0]',$data[1],$data[2])";
      ...
  }
  fclose($fp);
}
else
  print "Kan ikke åbne fil.txt";

?
Avatar billede dennismp Nybegynder
04. juni 2004 - 13:56 #4
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
skal bare være:
while (($data = fgetcsv($handle, 1000)) !== FALSE) {
Avatar billede dmg Nybegynder
04. juni 2004 - 13:58 #5
Jamen det er lige præcis sådan noget jeg ik kan finde ud af. I håb om at få nogle eksempler har jeg også afsat 60 points.

Hvordan åbner man en fil og i såfald, hvordan henter man data ud fra den? den skal jo tage alt bortset fra ; Ville blive glad for et eksempel eller 2
Avatar billede riversen Nybegynder
04. juni 2004 - 13:59 #6
Avatar billede dmg Nybegynder
04. juni 2004 - 14:06 #7
Nu har jeg skrevet således:

<?php
$link = mysql_connect ("portal", "root", "") or die ("Could not connect: " . mysql_error());
$DB = mysql_select_db("taxi") or die("Invalid query: " . mysql_error());

$fp = fopen('KTO30634.TXA','r');

  if( $fp )
  {
    while (($data = fgetcsv($handle, 1000)) !== FALSE)
    {

      $sql = "INSERT INTO regning (test1,test2,test3) VALUES('$data[0]',$data[1],$data[2])";

    }
    fclose($fp);
  }
  else
  {
    print "Kan ikke åbne fil.txt";
  }

?>

Men får disse fejl :(

Notice: Undefined variable: handle in C:\winnt\profiles\dmg\Desktop\webs\taxi\fil_insert.php on line 9

Warning: fgetcsv(): supplied argument is not a valid stream resource in C:\winnt\profiles\dmg\Desktop\webs\taxi\fil_insert.php on line 9
Avatar billede dennismp Nybegynder
04. juni 2004 - 14:07 #8
$fp = fopen('KTO30634.TXA','r');
skal være
$handle = fopen('KTO30634.TXA','r');
Avatar billede dennismp Nybegynder
04. juni 2004 - 14:07 #9
og
fclose($fp);
skal være
fclose($handle);
Avatar billede dmg Nybegynder
04. juni 2004 - 14:12 #10
ok nu er det tilrettet.

Så kommer denne fejl:

Notice: Undefined index: 1 in C:\winnt\profiles\dmg\Desktop\webs\taxi\fil_insert.php on line 12

det er sql sætningen
Avatar billede dennismp Nybegynder
04. juni 2004 - 14:16 #11
prøv i whilen at tilføje:
print_r($data);print "<br>";

og skriv outputtet her
Avatar billede dmg Nybegynder
04. juni 2004 - 14:19 #12
ok. den skriver nedenstående:

Array ( [0] => 1;10;3030634;27.02.04;30.03.04;05.04.04 )
Array ( [0] => 2;1;3632;882;2102919805;;;08.03.04;19.11.03;101 [1] => 00; )
Array ( [0] => 2;2;3646;210;2103088874;;;25.03.04;15.12.03;63 [1] => 00;0 [2] => 00 )
Array ( [0] => 2;3;3627;1981;2103089083;;;02.03.04;06.01.04;215 [1] => 00; )
Array ( [0] => 2;4;3626;1004;2103089124;;;01.03.04;08.01.04;86 [1] => 00;0 [2] => 00 )
Array ( [0] => 2;5;3625;1106;2103089191;;;27.02.04;12.01.04;128 [1] => 00;0 [2] => 00 )
Array ( [0] => 2;6;3625;1304;2103159408;;;27.02.04;19.01.04;382 [1] => 00;0 [2] => 00 )

osv.....

Det ser rigtigt godt ud. Det store spørgsmål er så hvordan jeg sortere det?
I databasen er der jo et felt for hvert semicolorn (;). how??? Super du gider lave de her eksempler!
Avatar billede riversen Nybegynder
04. juni 2004 - 14:22 #13
du kunne jo prøve min løsning :-)
Avatar billede dennismp Nybegynder
04. juni 2004 - 14:26 #14
prøv:
while (($data = fgetcsv($handle, 1000, ';')) !== FALSE) {
Avatar billede dmg Nybegynder
04. juni 2004 - 14:26 #15
det har jeg også prøvet riversen og det ser også godt ud, når man laver en printr, da den fjerne alle ; .

Men jeg aner ik hvor man kommer videre herfra.
Avatar billede riversen Nybegynder
04. juni 2004 - 14:30 #16
du laver bare din sql som du var i gang med ovenfor
Avatar billede dmg Nybegynder
04. juni 2004 - 14:30 #17
ja nu ser det bedre ud dennismp ;)

Jeg har netop, fået alt ind i databasen. 2 sek. tester lige lidt mere ;-)
Avatar billede dennismp Nybegynder
04. juni 2004 - 14:34 #18
Jeg troede at fgetcsv defaultede til ';' - men jeg to vist fejl :)
Avatar billede dmg Nybegynder
04. juni 2004 - 15:03 #19
yes. det virker kanon ;-)
hit med et svar.

Tusind tak til jer begge
Avatar billede dmg Nybegynder
04. juni 2004 - 15:28 #20
Hvad betyder de 1000?

while (($data = fgetcsv($handle, 1000, ';')) !== FALSE) {
Avatar billede dennismp Nybegynder
04. juni 2004 - 18:16 #21
fgets læser 1000 antal tegn eller til det nærmeste linjeskift. Typisk finder den linjeskiftet før den når de 1000 tegn
Avatar billede dmg Nybegynder
05. juni 2004 - 09:25 #22
okay :) du svarer bare mester, så du kan få dine points
Avatar billede dmg Nybegynder
05. juni 2004 - 10:35 #23
En ting jeg dog syntes er lidt mærkeligt, er at alt virker som det skal nu.

Min kode ser således ud, og jeg får nedenstående fejl. Men alt bliver smidt i databasen og virker fint. Hvad kan det være?

<?php
$link = mysql_connect ("portal", "root", "") or die ("Could not connect: " . mysql_error());
$DB = mysql_select_db("taxi") or die("Invalid query: " . mysql_error());


$handle = fopen('KTO30634.TXA','r');

  if( $handle )
  {
    while (($data = fgetcsv($handle, 1000, ';')) !== FALSE)
    {

      $sql = "INSERT INTO regning (test1, test2, test3, test4, kuponnr, bebiterings_dato, korsels_dato, belob, tillag) VALUES ('$data[0]', $data[1], $data[2], $data[3], $data[4], '$data[7]', '$data[8]', '$data[9]', '$data[10]')";
      $DB = mysql_query($sql);

//    print_r($data[1]);print "<br>";

    }
    fclose($handle);
  }
  else
  {
    print "Kan ikke åbne fil.txt";
  }

?>

Fejl:

Notice: Undefined index: 7 in C:\winnt\profiles\dmg\Desktop\webs\taxi\fil_insert.php on line 13

Notice: Undefined index: 8 in C:\winnt\profiles\dmg\Desktop\webs\taxi\fil_insert.php on line 13

Notice: Undefined index: 9 in C:\winnt\profiles\dmg\Desktop\webs\taxi\fil_insert.php on line 13

Notice: Undefined index: 10 in C:\winnt\profiles\dmg\Desktop\webs\taxi\fil_insert.php on line 13

Notice: Undefined index: 7 in C:\winnt\profiles\dmg\Desktop\webs\taxi\fil_insert.php on line 13

Notice: Undefined index: 8 in C:\winnt\profiles\dmg\Desktop\webs\taxi\fil_insert.php on line 13

Notice: Undefined index: 9 in C:\winnt\profiles\dmg\Desktop\webs\taxi\fil_insert.php on line 13

Notice: Undefined index: 10 in C:\winnt\profiles\dmg\Desktop\webs\taxi\fil_insert.php on line 13
Avatar billede dennismp Nybegynder
05. juni 2004 - 13:58 #24
Hmm prøv at tilføje dette i din while-løkke

if( count($data) != 11 ) {
  print "Der er for mange/få elementer:<br>";
  print_r($data[1]);print "<br>"; 
}

Prøv at smide det nye output her..
Avatar billede dmg Nybegynder
05. juni 2004 - 15:20 #25
okay, jeg har tilføjet den lige over else:

Notice: Undefined index: 7 in c:\inetpub\wwwroot\fil_insert.php on line 19

Notice: Undefined index: 8 in c:\inetpub\wwwroot\fil_insert.php on line 19

Notice: Undefined index: 9 in c:\inetpub\wwwroot\fil_insert.php on line 19

Notice: Undefined index: 10 in c:\inetpub\wwwroot\fil_insert.php on line 19

Notice: Undefined index: 7 in c:\inetpub\wwwroot\fil_insert.php on line 19

Notice: Undefined index: 8 in c:\inetpub\wwwroot\fil_insert.php on line 19

Notice: Undefined index: 9 in c:\inetpub\wwwroot\fil_insert.php on line 19

Notice: Undefined index: 10 in c:\inetpub\wwwroot\fil_insert.php on line 19
Der er for mange/få elementer:
Avatar billede dmg Nybegynder
05. juni 2004 - 15:23 #26
upss du sagde i while-løkken!!! ja selvfølgelig :)

her er outputtet:

Der er for mange/få elementer:
10

Notice: Undefined index: 7 in c:\inetpub\wwwroot\fil_insert.php on line 26

Notice: Undefined index: 8 in c:\inetpub\wwwroot\fil_insert.php on line 26

Notice: Undefined index: 9 in c:\inetpub\wwwroot\fil_insert.php on line 26

Notice: Undefined index: 10 in c:\inetpub\wwwroot\fil_insert.php on line 26
Der er for mange/få elementer:
751

Notice: Undefined index: 7 in c:\inetpub\wwwroot\fil_insert.php on line 26

Notice: Undefined index: 8 in c:\inetpub\wwwroot\fil_insert.php on line 26

Notice: Undefined index: 9 in c:\inetpub\wwwroot\fil_insert.php on line 26

Notice: Undefined index: 10 in c:\inetpub\wwwroot\fil_insert.php on line 26
Avatar billede dennismp Nybegynder
05. juni 2004 - 15:30 #27
det ser ud til at du har nogle linjer der er "underlige".

<?php
$link = mysql_connect ("portal", "root", "") or die ("Could not connect: " . mysql_error());
$DB = mysql_select_db("taxi") or die("Invalid query: " . mysql_error());


$handle = fopen('KTO30634.TXA','r');

  if( $handle )
  {
    $line = 0;
    while (($data = fgetcsv($handle, 1000, ';')) !== FALSE)
    {
      $line++;
      $sql = "INSERT INTO regning (test1, test2, test3, test4, kuponnr, bebiterings_dato, korsels_dato, belob, tillag) VALUES ('$data[0]', $data[1], $data[2], $data[3], $data[4], '$data[7]', '$data[8]', '$data[9]', '$data[10]')";
      $DB = mysql_query($sql);
      if( count($data) != 11 ) {
        print "Der er for mange/få elementer i linje $line:<br>";
        print_r($data);print "<br>"; 
      }
    }
    fclose($handle);
  }
  else
  {
    print "Kan ikke åbne fil.txt";
  }

?>

Så skulle den gerne skrive hvilket linje nummer i filen det drejer sig om.. Prøv at se nærmere på de linjer den brokker sig over.
Avatar billede dmg Nybegynder
05. juni 2004 - 15:47 #28
arhaaaa... det er fordi den første og sidste linje i dokumentet er forskelligt fra de andre. kan man gøre noget ved dette. Simpelthen fortælle den, at den ikke skal tage dem med? det ville være for sejt ;-)
Avatar billede dennismp Nybegynder
05. juni 2004 - 15:52 #29
joda - der skal ikke så meget til :)

<?php
$link = mysql_connect ("portal", "root", "") or die ("Could not connect: " . mysql_error());
$DB = mysql_select_db("taxi") or die("Invalid query: " . mysql_error());


$handle = fopen('KTO30634.TXA','r');

  if( $handle )
  {
    $line = 0;
    while (($data = fgetcsv($handle, 1000, ';')) !== FALSE)
    {
      $line++;
      if( count($data) != 11 ) {
        print "Der er for mange/få elementer i linje $line:<br>";
        print_r($data);print "<br>"; 
      }
      else {
        $sql = "INSERT INTO regning (test1, test2, test3, test4, kuponnr, bebiterings_dato, korsels_dato, belob, tillag) VALUES ('$data[0]', $data[1], $data[2], $data[3], $data[4], '$data[7]', '$data[8]', '$data[9]', '$data[10]')";
        $DB = mysql_query($sql);
      }
    }
    fclose($handle);
  }
  else
  {
    print "Kan ikke åbne fil.txt";
  }
?>
Avatar billede dmg Nybegynder
05. juni 2004 - 15:59 #30
okay |: hvad er forskellen?

Jeg kan slet ikke finde rettelsen?
Avatar billede dennismp Nybegynder
05. juni 2004 - 16:06 #31
Det er eller ikke meget. Jeg har blot flyttet sql-insert koden ind i en else af if(count($data) != 11 ). Så den enten "brokker sig" eller indsætter i databasen.
Avatar billede dmg Nybegynder
05. juni 2004 - 16:19 #32
jamen du skal ha dine points. du svarer bare ;-) tusind tak for hjælpen!!!
Avatar billede dennismp Nybegynder
05. juni 2004 - 16:23 #33
Det var så lidt :)
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