Pagina 1 di 5 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 43
  1. #1

    Cancellare righe da un file di testo

    Buonasera a tutti,

    Ho il seguente problema: ho un file di testo così formattato:

    contenuto1|contenuto2|...|contenuto14

    il file viene utilizzato per visualizzare ciascuna riga in un blocco del tipo:

    c1: contenuto1
    c2: contenuto2
    ...
    c3: contenuto3

    alla fine di ciascun blocco vorrei dare la possibilità di cancellare il blocco stesso e quindi la riga del file di testo da cui prende i dati. Una cosa del genere:

    ELIMINA RIGA

    if ($_GET['action'] == elimina){
    // istruzioni per l'eliminazione della riga
    // istruzioni per il refresh della pagina
    }
    Su questo forum ho letto che non si può cancellare direttamente una riga ma che si deve riscrivere l'intero file senza la riga suddetta, ma la cosa appare impossibile dal momento che il file lo sviluppo in un array di righe ache a loro volta sviluppo in un array di elementi separati dal simbolo |.

    Avevo pensato quindi ad un meccanismo che confrontasse gli elemnti del blocco in questione con le righe del file di testo e poi qualcosa per cancellare la riga che corrisponde, ma non saprei proprio come fare. Pare che nel manuale non vi siano istruzioni in merito.

    QUalcuno ha qualche idea?
    Viviamo tutti in una palude di fango, ma alcuni di noi guardano le Stelle http://www.comunicareoltre.it

  2. #2
    Utente di HTML.it L'avatar di luke83
    Registrato dal
    Jul 2000
    Messaggi
    1,217
    Codice PHP:
    <?
    $testo
    ="cont1|cont2|..|contN";
    ....
    $cont explode("|",$testo); // adesso cont è un array con ogni elemento un tuo blocco a quanto ho capito
    // se vuoi eliminare il blocco 3 ad esempio..

    unset($cont[2]);
    $testo=implode("|",$cont); // cont1|cont2|cont4|...|contN
    ...
    ?>
    spero di essere stato chiaro...
    ..::Luca::..
    » "se nn riesci a venirene a capo.. usa il tasto INVIO" © 2005 Luke83
    » "letta la documentazione, spazio all'immaginazione.." © 2006 Luke83
    [frasi random] - [Lucopedia] - [laFetta]

  3. #3
    Forse non sono stata chiara io, perchè tu sei stato molto chiaro, innanzitutto ti ringrazio perchè non conoscevo il comando unset, in ogni caso:

    il file di testo contiene n righe formattate come

    cont1|cont2|...|cont14

    per cui, così ad occhio, non ho testato, lo script che mandi esplode una riga sola ed elimina l'elemento che voglio.

    io invece voglio eliminare un'intera riga.

    Che dici, posso leggere il file di testo come un array tipo

    file($fileditesto)

    e poi applicare unset?

    Mi fai un esempio?
    Viviamo tutti in una palude di fango, ma alcuni di noi guardano le Stelle http://www.comunicareoltre.it

  4. #4
    Tipo così:

    codice:
    <?
      $file_di_testo = "./directory/file.txt";
      
      // il file è così formattato:
      // 050702|050704|Francesco|Rossi|frossi@server.it
      // 050716|050725|Roberta|Bianchi|rbianchi@server.it
      // ...
    
      // leggo il file in un array
      // ogni riga sarà un elemento dell'array
      $contenuto = file($file_di_testo);
    
      // adesso ho che:
      // $contenuto[0] = 050702|050704|Francesco|Rossi|frossi@server.it
      // $contenuto[1] = 050716|050725|Roberta|Bianchi|rbianchi@server.it
      // $contenuto[x] = ...
    
      // da una precedente elaborazione del file avevo estrapolato
      // gli elementi di ogni riga che vengono visualizzati in ciascun
      // blocco ed all' interno di esso si chiamano riga[0] riga[1] ...
      // ed in questo caso corrispondono a:
      // $riga[0] == 050702
      // $riga[1] == 050704
      // $riga[2] == Francesco
      // ecc.
    
      // se voglio cancellare contenuto[0] da un pulsante che compare
      // alla fine di ogni blocco imposto il pulsante (un link)
      ELIMINA RIGA
      // e poi vado a specificare al action elimina
      if ($action == 'elimina') { 
          // conto le occorrenze di $contenuto
          $occ = array_count_values($contenuto);
          // costruisco la stringa da confrontare con la riga del file
          $confronto = $riga[0]$riga[1]$riga[2]$riga[3]$riga[4];
          // imposto il ciclo for per la lettura ed il confronto delle
          // righe
          for($i=0;$i<$occ;$i++) {
              if ($contenuto[$i] == $confronto)
                   unset $contenuto[$i];
          }
       }
       // la pagina si ricarica da sola rileggendo il file e il blocco
       // corrispondente alla riga eliminata non dovrebbe esserci più
       // ma se fosse vero sarebbe troppo bello
    
    ?>
    Perdonami i troppi commenti ma l'ho fatto praticamente sul forum non sul mio editor...
    Viviamo tutti in una palude di fango, ma alcuni di noi guardano le Stelle http://www.comunicareoltre.it

  5. #5
    Utente di HTML.it L'avatar di luke83
    Registrato dal
    Jul 2000
    Messaggi
    1,217
    sì.. ok.. adesso mi è chiaro...

    dunque quello che ho scritto vale ancora...

    Codice PHP:
    <?
      $file_di_testo 
    "./directory/file.txt";
      
      
    // il file è così formattato:
      //  050702|050704|Francesco|Rossi|frossi@ser
    ver.it
      
    //  050716|050725|Roberta|Bianchi|rbianchi@s
    erver.it
      
    // ...

      // leggo il file in un array
      // ogni riga sarà un elemento dell'array
      
    $contenuto file($file_di_testo);

      
    // adesso ho che:
      // $contenuto[0] =  050702|050704|Francesco|Rossi|frossi@ser
    ver.it
      
    // $contenuto[1] =  050716|050725|Roberta|Bianchi|rbianchi@s
    erver.it
      
    // $contenuto[x] = ...

      // da una precedente elaborazione del file avevo estrapolato
      // gli elementi di ogni riga che vengono visualizzati in ciascun
      // blocco ed all' interno di esso si chiamano riga[0] riga[1] ...
      // ed in questo caso corrispondono a:
      // $riga[0] == 050702
      // $riga[1] == 050704
      // $riga[2] == Francesco
      // ecc.

      // se voglio cancellare contenuto[0] da un pulsante che compare
      // alla fine di ogni blocco imposto il pulsante (un link)
      
    [url="pagina.php?action=elimina&id=0"]ELIMINA RIGA 0[/url]
      
    // e poi vado a specificare al action elimina
      
    if ($action == 'elimina' && $id>=0) { 
          
    // conto le occorrenze di $contenuto
          
    unset($riga[$id]);
          
    $txt implode("\n"$riga);
          }
       }
       
    // la pagina si ricarica da sola rileggendo il file e il blocco
       // corrispondente alla riga eliminata non dovrebbe esserci più
       // ma se fosse vero sarebbe troppo bello
    ?>
    questo dovrebbe funzionare... devi solo fare attenzione ad un paio di cose...
    1. stai usando direttamente le var quando fovresti usare $_REQUEST["var"], ma a te pare tutto impostato correttamente se fino a sto punto funziona tutto.
    2. devi considerare la variabile id altrimenti nn funziona
    3. dopo la implode devi salvare il file
    4. ho ipotizzato usassi \n per separare le righe se usi altro come \r\n adatta la cosa..

    fammi sapere se ora è tutto ok...

    ..::Luca::..
    » "se nn riesci a venirene a capo.. usa il tasto INVIO" © 2005 Luke83
    » "letta la documentazione, spazio all'immaginazione.." © 2006 Luke83
    [frasi random] - [Lucopedia] - [laFetta]

  6. #6
    if ($_GET['action'] == elimina&&id=0){
    unset($riga[$id]);
    $txt = implode("\r\n", $riga);
    }
    Non ho provato, ma mi sa che non funziona. Parliamo in linguaggio umano:

    intanto credo che si debba impostare un ciclo for, quindi viene:

    if ($_GET['action'] == elimina&&id=0){
    $occ = array_count_values($contenuto);
    $confronto = $riga[0]$riga[1]$riga[2]$riga[3]$riga[4];
    for($i=0;$i<$occ;$i++) {
    if ($contenuto[$i] == $confronto){
    unset($contenuto[$i]);
    $file_di_testo = implode("\r\n", $contenuto);
    }
    }
    }
    Non so se così va bene, ma comunque non ho capito cos'è quell' id a cui ti riferisci

    Forse mi sono spiegata male ancora una volta, non voglio eliminare una riga di cui conosco la posizione nell' array, ma voglio eliminare la riga corrente, quella che ho trasformato in un blocco di informazioni. Il suo contenuto lo conosco, ma la sua posizione nell' array no, non vorrei che con quell'id vado ad eliminare solo la riga 0.

    Che ne dici?
    Viviamo tutti in una palude di fango, ma alcuni di noi guardano le Stelle http://www.comunicareoltre.it

  7. #7
    questo codice (tolto &&id=0) mi da errore nella riga:

    $confronto = $riga[0]$riga[1]$riga[2]$riga[3]$riga[4];
    a parte che conosco solo i primi 4 elementi di una riga che ne contiene 14 e quindi va studiato un confronto parziale delle righe, ma perchè è sbagliata?
    Viviamo tutti in una palude di fango, ma alcuni di noi guardano le Stelle http://www.comunicareoltre.it

  8. #8
    Ho messo le virgolette e ora non da errore, ma il punto è: come faccio a confrontare una riga con una riga di cui conosco solo 4 elementi ed eliminarla se coincidono i primi 4 elementi?

    (ovviamente c'è un altro errore,

    $confronto = "$riga[0]|$riga[1]|$riga[2]|$[riga[4]";
    avevo dimenticato |
    Viviamo tutti in una palude di fango, ma alcuni di noi guardano le Stelle http://www.comunicareoltre.it

  9. #9
    e se usassi array_splice?

    per esempio:

    codice:
    if ($_GET['action'] == elimina){ 
    $occ = array_count_values($contenuto); 
    $confronto = $riga[0]$riga[1]$riga[2]$riga[3]$riga[4]
    ; 
    for($i=0;$i<$occ;$i++) { 
    if ($contenuto[$i] == $confronto){ 
    array_splice($contenuto, $contenuto[$i]); 
    $file_di_testo = implode("\r\n", $contenuto); 
    } 
    } 
    }

    Resta sempre il problema su come confrontare una riga con una parte di riga, nel ciclo for dovrebbero apparire le seguenti istruzioni:

    if (la riga in questione ha i primi 4 elementi uguali a questi)
    cancella la riga
    implodi il file

    o no?
    Viviamo tutti in una palude di fango, ma alcuni di noi guardano le Stelle http://www.comunicareoltre.it

  10. #10
    Possibile che non ci sia un modo?

    Ho provato anche così:

    Codice PHP:
    <?
    $contenuto 
    file($file);
    if (
    $_GET['action'] == elimina){
    // conto le occorrenze dell' array in cui ho messo il file di testo  
    $occ array_count_values($contenuto);
    // stabilisco la riga con cui confrontare ciascun elemento dell' array 
    $confronto =  "$riga[0]|$riga[1]|$riga[2]|$riga[3]|$riga[4]|$riga[5]|$riga[6]|$riga[7]|$riga[8]|$riga[9]|$riga[10]|$riga[11]|$riga[12]|$riga[13]|$riga[14]";
    // imposto un ciclo for per leggere l' array 
    for($i=0;$i<$occ;$i++) {
    // se una delle righe è uguale identica alla riga che conosco... 
    if ($contenuto[$i] == $confronto){
    // elimina quella riga (elemento) dal vettore (file di testo) 
    array_splice($contenuto$contenuto[$i]);
    // rimetto il vettore nel file
    $file implode("\r\n"$contenuto);
    }
    // fuori dal ciclo for ma sempre nell' action "elimina" apro il file di testo in modalità scrittura (sovrascrive)
    $fp2 fopen($file"w")
    // scrivo nel file il vettore contenuto
    $fw fwrite($fp2$contenuto);
    // chiudo la modalità scrittura e il file
    fclose ($fp2); 


    }
    ?>
    Ebbene sembra tutto corretto, ma non funziona c'è un errore qui:

    $fw = fwrite($fp2, $contenuto);


    Come faccio?
    Viviamo tutti in una palude di fango, ma alcuni di noi guardano le Stelle http://www.comunicareoltre.it

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 © 2025 vBulletin Solutions, Inc. All rights reserved.