[PHP] Schrijven naar tekstfile

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Cerntje
  • Registratie: September 2003
  • Laatst online: 09-09 06:57
Ik moet gegevens van een Oracle8 database overzetten naar een MySQL database. Dit zal moeten gebeuren door de gegeven van de Oracle database in een tekstfile te zetten en deze tekstfile inlezen in de MySQL database.

Op dit moment kan ik de gegevens van de Oracle8 database uitlezen en in een tekstfile zetten via:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 

<?
$fp = fopen( "data_reservations.txt", "w+") //File opening for storing databaseresults
    or die("File could not be opened");

    $queryData = "SELECT * FROM RESERVATION";
    $result = mysql_query ($queryData);
    if(mysql_num_rows($result) == 0){
            echo "No records found";
    } else {
        for ($i = 0; $i < mysql_num_rows($result); $i++){
            $row_array = mysql_fetch_row($result);
            for ($j = 0; $j < mysql_num_fields($result); $j++){
                $writeresult = "$row_array[$j], ";  //After each fetch put a new line in
                fwrite( $fp, $writeresult );        //Write each row to file
            }
        }
    }
    mysql_free_result($result);
    fclose( $fp ); 
?>


Nu worden alle gegevens rechtstreeks achter elkaar in de tekstfile geplaatst gescheiden door een ','. Of als ik er '/n' van maak gescheiden door een regel.

Maar ik wil dat alle gegevens per record op 1 regel geschreven worden waarna een nieuwe regel begonnen wordt voor een andere record. Dit om het inlezen voor de MySQL database simpel te maken.

Ik krijg dit dus niet voor elkaar op dit moment :|

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:47

Creepy

Tactical Espionage Splatterer

Je loopt nu over al je velden en zet achter elk veld een komma. Dus dan kan je toch na die loop een newline afdrukken zodat elk record op een eigen regel staat?
Wat lukt je hierbij niet dan? Wat heb je al geprobeerd?

[ Voor 16% gewijzigd door Creepy op 19-10-2004 14:53 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Equator
  • Registratie: April 2001
  • Laatst online: 09-09 15:29

Equator

Crew Council

#whisky #barista

Als je table RESERVATIONS bijvoorbeeld 5 kolommen bevat, zal je alle 5 de kolommen uit moeten lezen, en wegschrijven met een seperator (;) er tussen.

Acties:
  • 0 Henk 'm!

  • Cerntje
  • Registratie: September 2003
  • Laatst online: 09-09 06:57
Creepy schreef op 19 oktober 2004 @ 14:53:
Je loopt nu over al je velden en zet achter elk veld een komma. Dus dan kan je toch na die loop een newline afdrukken zodat elk record op een eigen regel staat?
Wat lukt je hierbij niet dan? Wat heb je al geprobeerd?
OMG, nu je het zegt... :X

Als je de hele ochtend al bezig bent ga je echt schil kijken. Thanks, dit moet nu wel gaan werken denk ik :)

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:47

Creepy

Tactical Espionage Splatterer

Cerntje schreef op 19 oktober 2004 @ 14:55:
[...]


OMG, nu je het zegt... :X

Als je de hele ochtend al bezig bent ga je echt schil kijken. Thanks, dit moet nu wel gaan werken denk ik :)
Ach, en als je dan toch bezig bent: Dit stuk:
PHP:
1
$writeresult = "$row_array[$j], ";
is stiekum niet eens nodig als je weet hoe je strings aan elkaar kunt plakken (string concatenation). :) Je kan dan namelijk in 1 keer het veld tesamen met de komma afdrukken.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Cerntje
  • Registratie: September 2003
  • Laatst online: 09-09 06:57
Ik heb het nu al wel voor elkaar gekregen met de MySQL variant. Net elke row op een nieuwe regel waar elk attribuut komma seperated is. Alleen nu moet datzelfde ook gebeuren met de oracle variant.

Omdat dit nog een 'oude' versie van PHP is, versie 4.3.3, kan ik niet van de nieuwe OCI_fetch etc. gebruik maken. De enige commando's die ik tot mijn beschikking heb wat betreft fetchen zijn: OCIfetch, OCIfetchstatement en OCIfetchinto.

De documentatie over deze 3 zijn niet echt uitgebreid. Ga me maar weer is verdiepen in deze shit :P

Thanks alvast voor de reacties :)

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:34
Toevallig laatst met iets soortgelijks bezig geweest. Daar was performance ook nog een issue, de snelste manier om alle data uit een tabel te halen bij mij was het 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
function dump()
{
    # dbconnection
    global $db; global $DBNAME;
    if (!mysql_select_db($DBNAME,$db)) { return FALSE; }
    
    # fetch column names
    $query = mysql_query('SHOW COLUMNS FROM pge_data');
    if (mysql_num_rows($query))
    {
        while ($result = mysql_fetch_assoc($query)) 
                { $columns[] = $result['Field']; }
    } else {
        return FALSE;
    }

    $CONCAT = '`' .implode('`,"|",`', $columns) .'`';

    #fetch data
    $query = mysql_query('SELECT CONCAT(' .$CONCAT .') AS line FROM pge_data', $db);
    if (mysql_num_rows($query))
    {
        while ($result = mysql_fetch_assoc($query)) 
        { 
            $data[] = $result['line']; 
        }
    }

    $output  = implode('|', $columns) ."\n" .implode("\n", $data);
    return $output; 
}

Hierbij gebruik ik '|' om de kolommen te scheiden, maar dat kan natuurlijk ook met een komma. Nu weet ik niets van Oracle, maar het lijkt me stug dat die geen CONCAT aankan in een query. Dat scheelt een aardig end loopen iig...

[ Voor 9% gewijzigd door T-MOB op 19-10-2004 16:36 ]

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Cerntje
  • Registratie: September 2003
  • Laatst online: 09-09 06:57
T-MOB schreef op 19 oktober 2004 @ 16:35:
Toevallig laatst met iets soortgelijks bezig geweest. Daar was performance ook nog een issue, de snelste manier om alle data uit een tabel te halen bij mij was het volgende.
PHP:
1
Wat code  :)

Hierbij gebruik ik '|' om de kolommen te scheiden, maar dat kan natuurlijk ook met een komma. Nu weet ik niets van Oracle, maar het lijkt me stug dat die geen CONCAT aankan in een query. Dat scheelt een aardig end loopen iig...
Dankje, ik zal morgen gelijk ff kijken of ik wat kan merken aan de performance. Het gaat in mijn geval om zo'n 40k rijen die uit de database gehaald worden, dus misschien win ik nog een paar seconden B)

edit: Het is nu trouwens ook gelukt met de Oracle versie. Hij doet er ongeveer 30 seconden over om die 40k rijen uit te lezen en in een tekstfile te zetten. De tekstfile is daarna ongeveer 2,6MB groot.

[ Voor 14% gewijzigd door Cerntje op 19-10-2004 21:05 . Reden: extra info ]

Pagina: 1