Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

txt-file met tabs uitlezen

Pagina: 1
Acties:

  • fl1p
  • Registratie: Juli 2005
  • Laatst online: 09:26
Ik krijg iets maar niet in orde...

Situatieschets: Ik heb een bestand dat geëxporteerd is uit een website. Het is een txt met tabs gescheiden waarden. Ik krijg alles mooi op het scherm, moest het niet zijn dat er speciale gevallen in zitten.
In de eerste kolom staat altijd één van de volgende 3 waarden 1, 2 of 99
1 = nieuwe regel met gegevens
2 = update van kolom 9, "prijs" uit vorige regel
99 = einde van bestand

Wat doe ik?
Nu test ik of het eerste teken een 1, 2 of 99 is, en voer aan de hand daarvan een aantal regels code uit.

1: eenvoudig: insert-query maken. Dat werkt goed.
2: ik krijg die waarde uit die rij, kolom 9 maar niet geselecteerd...
99: nog eenvoudiger, moet ik zelfs geen rekening mee houden, negeer het volgende

Wat probeerde ik al?
Hieronder het bestand en de code die ik maakte.
(Ik ben geen pro, dus let niet op de dingen die nog korter konden :D Hier en daar staat ook een echo, en commentaar om te debuggen en te testen... maar zonder succes)

Wat doet hij dan wel? Hij neemt de waarde van de vorige rij mee, dus waar die 1 staat, in feite...

Welke richting moet ik uit zoeken?

PHP-Code
code:
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
$fileHandle= @fopen($file, "r");
    if ($fileHandle) 
    {
         while (!feof($fileHandle)) 
         {
             $ok=0;
             $querystart=""; $waarden=""; $queryend="";
             $i++;
             
             $lines = fgets($fileHandle);
             $regels = str_replace(chr(9),"@@",$lines);
             $columns = explode('@@', $regels);
    
            $aantalkolommen = count($columns);
            $t = 0;
            $skiprest = 0;
            for ($t = 0; $t <= $aantalkolommen; $t++) 
            {           
                $kolommen[$t] = str_replace('@@','',$columns[$t]);
                if($t == 0) //kolom 1 is code
                {
                    $inhoudkolom = $kolommen[$t];
                    echo "inhoudkolom : $inhoudkolom <br>";
                    switch($inhoudkolom)
                    {//1 = nieuw, 2 = update prijs, 99 = einde
                        case '1': 
                            //toevoegen
                            $querystart = "INSERT INTO proaccartikelen VALUES(";
                            $querend = ")";
                            $type = "insert";
                            echo "in insert <br>";
                            break;
    
                        case '2':
                            //update prijs
                            $sql = "SELECT * FROM proaccartikelen DESC Limit 1";
                            $r = mysql_query($sql); 
                            while($d = mysql_fetch_array($r))
                            {
                                $artcode = $d['artikelcode'];
                            }
                            $querystart = "UPDATE proaccartikelen SET bedrag = '$kolommen[9]'";
                            $queryend = " WHERE artikelcode = '$artcode'";
                            $skiprest = "1";
                            //$type = "update";
                            echo "in update<br>";
                            break;
    
                        case '99':
                            echo '<br/>einde<br/>';
                            $skiprest == 1;
                            break;
    
                        default:
                            break;
                    }
                }
                else
                {
                    if($type == "insert") $waarden .= "'".$kolommen[$t]."', ";
                    //if($type == "update") $waarden .= "'".$kolommen[9]."'";
                    if($skiprest == "1") $t = 5000;
                }
            }
            if($type == "insert") {$waarden = substr_replace($waarden ,"",-2); $waarden .= ")"; }
            echo "Volledige query: ".$querystart.$waarden.$queryend;
            echo '<br>';
        }
    fclose($fileHandle);
    }


(Deeltje van) het bestand:
code:
1
2
3
4
5
6
1   740010  BIJDRAGESECUNDA Bijdrage scholengemeenschap     740010          0   0   0,8000  EUR 0   EUR 0,00    1   0   0   0   0   0       0       0       0       0       0                   24/02/2011          23 JUN 11  09:50:12     0   0   0   0   0       09/03/2012
2                           0   0   5,0000  EUR 0       0,00    0   0   0   0   0   0       0       0       0       0       0                                       0   0   0   0   0       
1   460300  CONCLAAFSG  CONCLAAF SG 460300          0   21  0,7000  EUR 0   EUR 0,00    1   0   0   0   0   0       0       0       0       0       0                   02/05/2011          2 MAY 11  09:42:30      0   0   0   0   0       30/04/2011
2                           0   0   419,0000    EUR 0       0,00    0   0   0   0   0   0       0       0       0       0       0                                       0   0   0   0   0       
1   460700  NASCHOLINGVSKOV Nascholing VSKO: 'Voor een goed begrip' Taal beschouwen, hoe dan? (A-stroom)    460700          0   0   0,0000  EUR 0   EUR 0,00    1   0   0   0   0   0       0       0       0       0       0                   05/05/2011          5 MAY 11  08:57:48      0   0   0   0   0       15/02/2012
2                           0   0   7,6900  EUR 0       0,00    0   0   0   0   0   0       0       0       0       0       0                                       0   0   0   0   0

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • fl1p
  • Registratie: Juli 2005
  • Laatst online: 09:26
Excuses. Volgende keer lees ik het door alvorens te posten!
Bedankt voor het verplaatsen :)

  • Keeper
  • Registratie: Juni 2001
  • Niet online

Keeper

<3 Ruby

Het is misschien heel simpel, maar je gebruikt nu kolommen[9] als de kolom waar de prijs in moet zitten, maar als ik je bestand goed lees moet dat kolommen[8] zijn. Nu probeer je de waarde 'EUR' in die UPDATE query te stoppen namelijk.

Ik weet niet hoe groot de bestanden zijn die je inleest, maar ik zou eens kijken naar functies als implode en explode, waarbij je van een string met een bepaalde delimiter (tab, comma) als array kan inlezen. Scheelt je weer een hoop gedoe met die for loops etc.

  • fl1p
  • Registratie: Juli 2005
  • Laatst online: 09:26
Bedankt. Het zijn kleine bestandjes, van zo'n 40 regels... Ik verdiep me eens in die functies :)

Als ik een ander cijfer gebruik, neemt hij nog steeds de waarde uit de bovenliggende rij... Op dit moment neem hij, de eerste keer hij de 2 tegenkomt, de waarde 0,8.

  • Keeper
  • Registratie: Juni 2001
  • Niet online

Keeper

<3 Ruby

Probeer het anders in losse stappen op te breken.

• Lees elke bestandsregel in in een array
• Zet de waardes in een bestandsregel om in een array, in die vorige array
• Loop door de eerste array, bepaal op basis van 1e waarde wat je gaat doen
• Pak de ID van de vorige regel in de array als je de update query uitvoert

De array waar je uiteindelijk overheen gaat loopen ziet er dan als volgt uit:

code:
1
2
3
4
array(
  0 => array('a', 'b', 'c'),
  1 => array('d', 'e', 'f')
)


Succes :).

[ Voor 8% gewijzigd door Keeper op 08-10-2012 12:21 ]


  • Big Womly
  • Registratie: Oktober 2007
  • Laatst online: 01-09 13:39

Big Womly

Live forever, or die trying

Niet een taal waar ik mij thuis in voel. PHP?
Code
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
                        case '2':
                            //update prijs
                            $sql = "SELECT * FROM proaccartikelen DESC Limit 1";
                            $r = mysql_query($sql); 
                            while($d = mysql_fetch_array($r))
                            {
                                $artcode = $d['artikelcode'];
                            }
                            $querystart = "UPDATE proaccartikelen SET bedrag = '$kolommen[9]'";
                            $queryend = " WHERE artikelcode = '$artcode'";
                            $skiprest = "1";
                            //$type = "update";
                            echo "in update<br>";
                            break;

Maar volgens mij doorloop je met deze while alle rijen die je van je select terugkrijgt, ipv te stoppen wanneer je het juiste artikel gevonden hebt.

[ Voor 74% gewijzigd door Big Womly op 08-10-2012 12:35 ]

When you talk to God it's called prayer, but when God talks to you it's called schizophrenia


  • Keeper
  • Registratie: Juni 2001
  • Niet online

Keeper

<3 Ruby

Big Womly schreef op maandag 08 oktober 2012 @ 12:23:
Maar volgens mij doorloop je met deze while alle rijen die je van je select terugkrijgt, ipv te stoppen wanneer je je juiste artikel gevonden hebt.
Klopt idd. Die hele SELECT heb je trouwens niet nodig als je de hierboven beschreven methode met arrays gebruikt :).

  • Big Womly
  • Registratie: Oktober 2007
  • Laatst online: 01-09 13:39

Big Womly

Live forever, or die trying

heeft de omgeving waarin je ontwikkeld geen debug optie? Dit zijn fouten die snel naar boven komen tijdens het debuggen.

When you talk to God it's called prayer, but when God talks to you it's called schizophrenia


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
de txt file heeft toch verdomd veel weg van een csv file...
zou je dan niet http://php.net/manual/en/function.fgetcsv.php kunnen gebruiken?

  • fl1p
  • Registratie: Juli 2005
  • Laatst online: 09:26
Als ik hem wil importeren als csv, dus uploaden als txt, zo komt hij van de andere site, en verander van extensie, aanvaardt fgetcsv hem niet...

Die array lijkt een goede oplossing. Ik ga er mee aan de slag!
Keeper schreef op maandag 08 oktober 2012 @ 12:21:
Probeer het anders in losse stappen op te breken.

• Lees elke bestandsregel in in een array
• Zet de waardes in een bestandsregel om in een array, in die vorige array
• Loop door de eerste array, bepaal op basis van 1e waarde wat je gaat doen
• Pak de ID van de vorige regel in de array als je de update query uitvoert

De array waar je uiteindelijk overheen gaat loopen ziet er dan als volgt uit:

code:
1
2
3
4
array(
  0 => array('a', 'b', 'c'),
  1 => array('d', 'e', 'f')
)


Succes :).
Super idee, het heeft gewerkt! Bedankt voor de tips _/-\o_

[ Voor 62% gewijzigd door fl1p op 10-10-2012 14:28 . Reden: posts merged ]

Pagina: 1