[php] .txt naar mysql probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • paragon
  • Registratie: April 2000
  • Laatst online: 20-09 16:38
Ik ben bezig met een script dat een tst bestand overzet naar een mysql database. Het tekst bestand is een copy paste uit een excel sheet. Ik kom nu alleen op het probleem dat er vanuit een bepaald tekstbestand er maat 1415 records ingevoegd worden en dat de INSERT er me stopt ik krijg dan bij affected rows een -1. eerst dacht ik eraan dat dit misschien een of andere vage beperking was maar toen ik met een ander tekst bestand testte werden alle 2530 records ingevoegd. Ik heb het gedeelte in het tekstbestand opgezoch waar het fout gaat. Ik zie alleen niet waarom omdat het foutgaat. Ik ben opzoek gegaan naar de waarde van het 1415record in het tekstbestand en ben 1415, 1416, 1417 gaan vervangen om te kijken of het dan wel werkte maar zonder succes.

185 355023000354715 185 355023001148595 185 355023000667603 185 355023000357320 185 355023000357460 185 355023000372022 185 355023000358435[

De 185's worden eriut gefilterd. De code die ik gebruik om van .txt naar mysql te gaan is de volgende:
PHP:
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
<?php
include 'db/connect.php';
$rows= file ( 'test.txt' );
$one = 1;

$strSQL = "INSERT INTO emei VALUES";
$strSQL_ADD = "";

foreach ( $rows as $row ) {
    //echo $row."<br />";
    if (preg_match('/\d{2}\.\d{2}\.\d{2}/', $row, $matches)) { 
        $date = $matches[0];
    }
    if (preg_match('/\b\w{7,10}\b/', $row, $matches)) { 
        $serial = $matches[0];
    }
    if (preg_match_all('/PALLET\s\d{1,2}/', $row, $matches)) { 
        for ($x = 0; $x < sizeof($matches[0]); $x++) {
            //print $matches[0][$x]."<br />";
        }
    //print "<br />";
    }
    if (preg_match_all('/\d{15}/', $row, $matches)) { 
        for ($x = 0; $x < sizeof($matches[0]); $x++) {
            //print $matches[0][$x]."\t";
            $y = $x + 1;
            $strSQL_ADD = $strSQL_ADD."('".$matches[0][$x]."','".$date."','".$serial."','".$y."'), ";
        }
        //print "<br />";
    }

    //$strSQL = $strSQL.$strSQL_ADD;
}

$strSQL_ADD = rtrim($strSQL_ADD, ", ");
$strSQL = $strSQL.$strSQL_ADD;
print "<p style=\"font-family:verdana;font-size:11px;\">".$strSQL."</p>";

$link = opendb(0);
mysql_query ( $strSQL );
echo mysql_affected_rows (), " records inserted";
?>


voor de volledigheid hier is de sql statement: http://paragonxls.xs4all.nl/php/evolve/insert.php

[ Voor 64% gewijzigd door paragon op 18-03-2005 14:00 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Als je steeds 185 als scheiding hebt, waarom gebruik je dan niet gewoon explode?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • paragon
  • Registratie: April 2000
  • Laatst online: 20-09 16:38
Heb niet steeds 185 als scheiding deze waarden staan op rij 185.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Dan nog kun je explode gebruiken. Gewoon exploden, en dan alleen naar de even array indices kijken.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 16:28
Ik vind de topic start een beetje onduidelijk: je post een stuk invoer, maar de code die je post verwerkt een heel ander soort data (iets met PALLET's erin?). Ik denk dat -NMe- daarom ook het punt mist.

Excel kan trouwens ook naar handigere formaten zoals tab-delimited text wegschrijven, dat parset veel makkelijker. Als je dat niet wil, kun je beter de query die faalt (dat kon je immers detecteren) printen en kijken wat daar in staat wat niet door de beugel kan, samen met de foutmelding die MySQL erbij geeft.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Het is niet zozeer dat ik het punt mis, eerder dat ik al die regexps nogal onnodig vind. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Heb je ook al even geprobeert om met mysql_error te kijken welke foutmelding mysql geeft?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • paragon
  • Registratie: April 2000
  • Laatst online: 20-09 16:38
Ik heb nog wat onderzoek gedaan.
De hele tekst bestan bestaat in dit geval uit 502 rijen.
Op rij 1 staat een datum en een code.
Op rij 2 staat in dit geval PALLET 1 PALLET 2 t/m PALLET 9.
Op rij 3 t/m 502 staan regelnummer + 15nummerig getal regelnummer + 15nummerig getal ....

Als ik alles text wil laten parsen dan stopt de insert na het 2de 15nummerige getal op rij 185 dus alles na dat getal wordt niet door de insert uitgevoerd en de affected rows is -1

Als ik nou rijen met regelnummers 1-184 weghaal dan worden de 15nummerige getallen van de rij met regelnummer 185 wel ingevoegd en knalt ie er 781 nummers verder wer uit met een affected rows van -1.

Zoals ik het nu bekijk ligt het dus niet aan de getallen op rij 185. Dat ik omslachtig met die regex te werk ga is mijn gebrek aan kennis van explode :| al zit het probleem daar naar mijn idee niet in.

Acties:
  • 0 Henk 'm!

  • paragon
  • Registratie: April 2000
  • Laatst online: 20-09 16:38
Janoz schreef op vrijdag 18 maart 2005 @ 15:04:
Heb je ook al even geprobeert om met mysql_error te kijken welke foutmelding mysql geeft?
Doh duplicate key entry en ik ging er van uit dat de 15nummige getallen uniek waren. Dat was iig wel de bedoeling ga meteen contact opnemen met de leverancier...
Pagina: 1