Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Da un txt non proprio ideale a mysql.....

    Salve
    sto cercando di fare uno scriptino di statistiche per lo shard di ultima online nel quale lavoro(su sphere server), sorge subito il primo problema....:

    io ho un txt contenente una cosa tipo questa:

    codice:
    \\ Sphere Menace Central accounts file
    \\ NOTE: This file cannot be edited while the server is running.
    \\ Any file changes must be made to sphereaccu.scp. This is read in at save time.
    
    [Firestorm]
    PLEVEL=GM
    PRIV=0104a
    PASSWORD=123
    TOTALCONNECTTIME=23
    LASTCONNECTTIME=4
    LASTCHARUID=04543
    CHARUID=04543
    FIRSTCONNECTDATE=2004/01/10 16:24:14
    FIRSTIP=80.183.127.235
    LASTCONNECTDATE=2004/01/10 16:46:19
    LASTIP=80.183.127.235
    LANG=ITA
    
    [Himeko]
    PLEVEL=Admin
    PRIV=0104a
    PASSWORD=ciao
    TOTALCONNECTTIME=532
    LASTCONNECTTIME=87
    LASTCHARUID=06260
    CHARUID=04404
    CHARUID=06260
    FIRSTCONNECTDATE=2003/07/05 19:27:25
    FIRSTIP=127.0.0.1
    LASTCONNECTDATE=2004/03/08 16:34:16
    LASTIP=127.0.0.1
    LANG=ITA
    
    [Lod]
    PLEVEL=GM
    PRIV=0104a
    PASSWORD=bao
    
    [Michelangelo]
    PLEVEL=GM
    PRIV=0104a
    PASSWORD=miao
    TOTALCONNECTTIME=73
    LASTCONNECTTIME=27
    LASTCHARUID=04576
    CHARUID=04576
    FIRSTCONNECTDATE=2003/07/14 18:05:29
    FIRSTIP=80.116.236.118
    LASTCONNECTDATE=2003/07/14 18:58:55
    LASTIP=80.116.236.118
    LANG=ita
    parte di questi dati vanno mandati a una tabella fatta così:

    codice:
    #
    # Struttura della tabella `sphereaccu`
    #
    
    CREATE TABLE sphereaccu (
      ID_accu int(5) NOT NULL auto_increment,
      Nome_accu varchar(15) NOT NULL default '',
      Level_accu varchar(10) NOT NULL default '',
      TotalCon_accu int(10) NOT NULL default '0',
      LastCon_accu int(10) NOT NULL default '0',
      FirstConDate_accu datetime NOT NULL default '0000-00-00 00:00:00',
      LastConDate_accu datetime NOT NULL default '0000-00-00 00:00:00',
      UNIQUE KEY ID_accu (ID_accu)
    ) TYPE=MyISAM;
    di php ho solo un infarinatura e vado in giro con il reference a portata di mano, ecco quello che sono riuscita a fare da sola:

    Codice PHP:
    <?php 
    include("include/connessione.inc.php");
    include(
    "include/ottieni_dati.inc.php");
    $scissione explode("["$contenuto);
    // scindo le voci a gruppi
    $inutile array_shift ($scissione);
    // elimino la prima voce
    print_r($scissione);
    ?>
    e ho ottenuto il famigerato file, (privo del commento iniziale e di una quadra ogni nome account) in un array con un account per voce, a questo punto mi sono bloccata e mi è venuto mal di testa....
    potete aiutarmi?



    PS: il txt non può essere formattato meglio, essendo parte integrante di sphere, (almeno credo... certo non potrei farlo io... dovrei chiedere a un programmatore dello shard... )
    e viene automaticamente aggiornato a ogni salvataggio del mondo

  2. #2
    Con un
    $datiutenti = explode("\n\r\n\r", $scissione);
    dovresti ottenere un array con in ogni cella tutti i dati di un utente.

    Dopodichè servirebbe un
    str_replace("]","");
    in modo da togliere la ] dal nome utente.

    Dopodichè esegui un ciclo

    for($i=0; /*non sei alla fine dell'array $datiutenti*/; $i++){
    $datiutente = explode("\r\n", $datiutenti[$i]);
    for($x=0; /*non sei alla fine dell'array $datiutente*/; $x++){
    //$datiutente[0] è il nome dell'utente
    //poi fai i controlli sulle altre celle, e in base ai dati che trovi e non trovi crei la striga sql per l'inserimento nel DB.
    //esegui la stringa
    //dovrebbe essere terminato l'inserimento di un utente
    }
    }

    //scusa se non sono stato più chiaro, ma ho un po' di fretta... sorry.

  3. #3
    codice:
    // $myFileReaded sara' il contenuto del file 
    
    // elimino i commenti
    $myFile = preg_replace( "/(?i)\\\\([^\a]+?)\[/i", " [", $myFileReaded );
    
    // riorganizzo il nome tra quadre
    $myFile = preg_replace( "/(?i)([[:space:]]+)(\[)([a-z]+)(\])/", "@NAME=\\3", $myFile );
    
    // elimino gli 'a capo' superflui
    $myFile = preg_replace( "/(?i)([\r|\n]+)/", "|", $myFile );
    
    // esplodo l' array per gruppi con la @
    $myArray = explode( "@", $myFile );
    
    $queryArray = Array(); // array ordinato per chiavi
    $nodeName = ""; // nome per ogni gruppo
    
    for( $a = 0, $b = count( $myArray ); $a < $b; $a++ ) {
    	if( ( $myArray[$a] = trim($myArray[$a]) ) != "" ) {
    		$myArray[$a] = explode( "|", $myArray[$a] );
    		for( $c = 0, $d = count( $myArray[$a] ); $c < $d; $c++ ) {
    			if( ( $myArray[$a][$c] = trim($myArray[$a][$c]) ) != "" ) {
    			        $myArray[$a][$c] = explode( "=", $myArray[$a][$c] );
    				if( $myArray[$a][$c][0] == "NAME" ) {
    					$queryArray[$myArray[$a][$c][1]] = Array();
    					$nodeName = $myArray[$a][$c][1];
    				}
    				else {
    					$queryArray[$nodeName][$myArray[$a][$c][0]] = $myArray[$a][$c][1];
    				}
    			}
    		}
    	}
    }
    
    echo "<pre>";
    var_dump( $queryArray );
    echo "</pre>";
    
    // il var_dump dara' come risultato quanto segue:
    array(4) {
      ["Firestorm"]=>
      array(12) {
        ["PLEVEL"]=>
        string(2) "GM"
        ["PRIV"]=>
        string(5) "0104a"
        ["PASSWORD"]=>
        string(3) "123"
        ["TOTALCONNECTTIME"]=>
        string(2) "23"
        ["LASTCONNECTTIME"]=>
        string(1) "4"
        ["LASTCHARUID"]=>
        string(5) "04543"
        ["CHARUID"]=>
        string(5) "04543"
        ["FIRSTCONNECTDATE"]=>
        string(19) "2004/01/10 16:24:14"
        ["FIRSTIP"]=>
        string(14) "80.183.127.235"
        ["LASTCONNECTDATE"]=>
        string(19) "2004/01/10 16:46:19"
        ["LASTIP"]=>
        string(14) "80.183.127.235"
        ["LANG"]=>
        string(3) "ITA"
      }
      ["Himeko"]=>
      array(12) {
        ["PLEVEL"]=>
        string(5) "Admin"
        ["PRIV"]=>
        string(5) "0104a"
        ["PASSWORD"]=>
        string(4) "ciao"
        ["TOTALCONNECTTIME"]=>
        string(3) "532"
        ["LASTCONNECTTIME"]=>
        string(2) "87"
        ["LASTCHARUID"]=>
        string(5) "06260"
        ["CHARUID"]=>
        string(5) "06260"
        ["FIRSTCONNECTDATE"]=>
        string(19) "2003/07/05 19:27:25"
        ["FIRSTIP"]=>
        string(9) "127.0.0.1"
        ["LASTCONNECTDATE"]=>
        string(19) "2004/03/08 16:34:16"
        ["LASTIP"]=>
        string(9) "127.0.0.1"
        ["LANG"]=>
        string(3) "ITA"
      }
      ["Lod"]=>
      array(3) {
        ["PLEVEL"]=>
        string(2) "GM"
        ["PRIV"]=>
        string(5) "0104a"
        ["PASSWORD"]=>
        string(3) "bao"
      }
      ["Michelangelo"]=>
      array(12) {
        ["PLEVEL"]=>
        string(2) "GM"
        ["PRIV"]=>
        string(5) "0104a"
        ["PASSWORD"]=>
        string(4) "miao"
        ["TOTALCONNECTTIME"]=>
        string(2) "73"
        ["LASTCONNECTTIME"]=>
        string(2) "27"
        ["LASTCHARUID"]=>
        string(5) "04576"
        ["CHARUID"]=>
        string(5) "04576"
        ["FIRSTCONNECTDATE"]=>
        string(19) "2003/07/14 18:05:29"
        ["FIRSTIP"]=>
        string(14) "80.116.236.118"
        ["LASTCONNECTDATE"]=>
        string(19) "2003/07/14 18:58:55"
        ["LASTIP"]=>
        string(14) "80.116.236.118"
        ["LANG"]=>
        string(3) "ita"
      }
    }
    quindi il risultato sara' un array ordinato con una chiave per ogni "nome-gruppo" e i relativi valori chiave per ogni sotto-gruppo

    Ora non devi far altro che orgenizzarti un ciclo per strutturare la query
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  4. #4
    Io vorrei darti un consiglio:
    invece di usare la funzione:
    Codice PHP:
    <?php 

    include("include/connessione.inc.php");

    include(
    "include/ottieni_dati.inc.php");

    $scissione explode("["$contenuto);

    // scindo le voci a gruppi

    $inutile array_shift ($scissione);

    // elimino la prima voce

    print_r($scissione);

    ?>
    Usa questa piu' semplice e funzionale
    Codice PHP:
    <?php
    $scissione 
    = array(); //Come tu la chiami
    $scissione=parse_ini_file("nome_e_percorso_del_file_di_testo_con_i_dati.txt",true);
    //Otterrai un array multidimensionale
    echo "<pre>";
    print_r($scissione);
    echo
    "</pre>";
    ?>
    MiServe di Santino Bivacqua
    PHP/Ruby/Node.js Developer
    www.miserve.com

  5. #5
    parse_ini_file

    ... mitico



    [ e io che c'ho perso 4 minuti per fare la stesa cosa ]
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  6. #6
    Originariamente inviato da andr3a
    parse_ini_file

    ... mitico



    [ e io che c'ho perso 4 minuti per fare la stesa cosa ]
    Forum come questo esistono anche per questo, non credi?
    Anch'io ho imparato cose nuove grazie a chi scrive su questo forum, a volte passo delle ore a leggermi i 3d degli utenti, ed oramai quando mi collego, il primo sito che visito e' forum.html.it
    MiServe di Santino Bivacqua
    PHP/Ruby/Node.js Developer
    www.miserve.com

  7. #7
    Attenzione pero' i commenti in un file ini devono iniziare con ; e non con \\, quindi prima di parsare il file ti consiglio di sostituire i commenti con un bel:
    Codice PHP:
    str_replace("\\\\",";",$testo); 
    MiServe di Santino Bivacqua
    PHP/Ruby/Node.js Developer
    www.miserve.com

  8. #8
    Grazie a tutti non so come avrei fatto senza il vostro aiuto ^__^

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.