• User

    Cancellare riga di testo in file txt in base alla data

    Ciao a tutti, come posso fare ad automatizzare la cancellazione di una riga di testo, in base alla data di scrittura, da un file data.txt?
    Per esempio:

    Giorgio;xxxxxxxxxxxxxxxxxxx;2019-02-23
    Laura;xxxxxxxxxxxxxxxxxxx;2019-03-30

    Mettiamo che voglia far cancellare ogni rispettiva riga dopo un anno dalla data impressa.
    E` una cosa possibile? In alternativa, mi andrebbe bene anche spostarla in un altro file, per esempio data2.txt. Grazie mille per l'aiuto


  • Moderatore

    Ciao Cosina,
    dovresti creare un file che esegue il parse del documento txt, andando ad individuare la riga secondo l'anno per poi eseguire la cancellazione ove necessaria. A questo devi poter implementare, accedendo al server, un cron, che magari ogni giorno alle ore 00:00:00 esegue il file di controllo realizzato in precedenza.

    [PHP]
    $txt_file = file_get_contents('path/to/file.txt');
    $rows = explode("\n", $txt_file);

    unlink('path/to/file.txt');
    $new_file = fopen('path/to/file.txt', 'a+');
    foreach($rows as $row)
    {
    $data = explode(';', $row);
    //esempio, se il tuo valore data è la terza occorrenza
    if( ( strtotime($data[2]) + 31536000 ) >= time() ) {
    fwrite( $new_file, $row );
    }

    }
    fclose( $new_file );
    [/PHP]

    Mi raccomando, prima di eseguire il file come test, esegui un backup del tuo file txt in quanto ho aggiunto l'istruzione unlink() sul file che lo rimuove in maniera inreversibile.


  • User

    Grazie mille Ultima, so come impostare un cron. Nei prossimi giorni faccio le prove. Sei stato gentilissimo


  • User

    Ciao, ho provato ed ha funzionato perfettamente (grazieeeee!!!). Unico problema: le righe, nel file di testo originale, sono incolonnate, cosi`:

    Giorgio;xxxxxxxxxxxxxxxxxxx;2019-02-23
    Laura;xxxxxxxxxxxxxxxxxxx;2019-03-30

    Quando il sistema copia e ricrea il file, me le mette tutte in linea, così:

    Giorgio;xxxxxxxxxxxxxxxxxxx;2019-02-23Laura;xxxxxxxxxxxxxxxxxxx;2019-03-30

    C'è il modo per farle riscrivere incolonnate come originariamente? Altrimenti la consultazione diventa quasi impossibile. Grazie mille


  • Moderatore

    Di nuovo ciao Cosina. Certo che c'è il modo.
    Modifica questa istruzione:
    [PHP]
    fwrite( $new_file, $row );
    [/PHP]

    In questo modo:
    [PHP]
    fwrite( $new_file, $row . "\n" );
    [/PHP]

    Fammi sapere.
    Ciao.


  • User

    Ha funzionato perfettamente, grazie mille, mi hai dato un grande aiuto. Lo devo dire, questo forum e il migliore che conosca. Competenza, professionalita e disponibilita. In altri ho trovato spesso arroganza e anche mascherate finalita di guadagno. Premesso che tutti dobbiamo guadagnare, io credo che la collaborazione tra professionisti e non, nelle piccole cose, sia cosa giusta e reciprocamente utile. Buona giornata a te e a tutti. Ciao


  • Moderatore

    @Cosina said:

    Ha funzionato perfettamente, grazie mille, mi hai dato un grande aiuto. Lo devo dire, questo forum e il migliore che conosca. Competenza, professionalita e disponibilita. In altri ho trovato spesso arroganza e anche mascherate finalita di guadagno. Premesso che tutti dobbiamo guadagnare, io credo che la collaborazione tra professionisti e non, nelle piccole cose, sia cosa giusta e reciprocamente utile. Buona giornata a te e a tutti. Ciao
    Io ti ringrazio per le belle parole che hai scritto. Fa sempre piacere ricevere elogi.
    Per quanto mi riguarda, sono contento che ti abbia aiutato a risolvere il tuo grattacapo. Esattamente come hai scritto, siamo qui per confronto e anche darci una mano a vicenda.
    Per qualsiasi altra problematica, siamo sempre qui!
    Ciao. 🙂


  • Community Manager

    @Cosina said:

    Ha funzionato perfettamente, grazie mille, mi hai dato un grande aiuto. Lo devo dire, questo forum e il migliore che conosca. Competenza, professionalita e disponibilita. In altri ho trovato spesso arroganza e anche mascherate finalita di guadagno. Premesso che tutti dobbiamo guadagnare, io credo che la collaborazione tra professionisti e non, nelle piccole cose, sia cosa giusta e reciprocamente utile. Buona giornata a te e a tutti. Ciao

    Grazie mille Cosina per questo feedback, è per questo che il forum gt è nato, proprio perché quando sono arrivato sulla rete per la prima volta avevo riscontrato troppa arroganza e poca voglia di aiutarsi. Io credo nella condivisione della conoscenza per una crescita globale.

    E ci sono persone come Stefano che condividono questa filosofia e la applicano concretamente, anche se sono strapieni di lavoro 🙂

    In una grande Internet dove l'arroganza dilaga, sapere che esiste un ambiente come questo è un sollievo.

    :ciauz:


  • User

    Grazie Ultima, sei davvero gentilissimo e grazie anche a te, Giorgio, per il tuo gradito intervento. Quello che dite e` verissimo. Anch'io, nell'ambito delle mie competenze (webdesign), non ho mai perso l'occasione di dare consigli e aiuto agli utenti che mi scrivono e la considero una cosa che, prima di tutto, gratifica e arricchisce me stessa.


  • User

    Approfitto ancora una volta della vostra competenza per un ultimo suggerimento.
    Sempre considerando il file di testo oggetto della discussione, vorrei sapere se sarebbe possibile creare un form tramite il quale un utente possa cancellare direttamente la riga corrispondente ai suoi dati. Qualcosa di simile per intenderci:

    [HTML]<form class="form-contact" action="action.php" method="post" enctype="multipart/form-data">

    <p><label>Nome:<br></label><input type="text" name="name"/></p>

    <p><label>Password:<br></label><input type="text" name="password"/></p>

    <input class="button" type="submit" value="Delete">

    </form>[/HTML]

    Considerando che nel file di testo data.txt e nella riga di esempio:

    Laura;xxxxxxxxxxxxxxxxxxx;2019-03-30

    lo spazio occupato dalle crocette equivale alla password criptata.
    In pratica, vorrei sapere cosa mettere nel file action.php per ottenere questo risultato.

    Di nuovo, immensamente grazie


  • Moderatore

    Ciao Cosina. L'esempio che avevo scritto in precedenza, lo puoi piegare in base alle tue esigenze aggiungendo o rimuovendo parti che possano tornarti utili.
    Il procedimento è il medesimo della data: Si effettua un riconoscimento tramite una condizione e in caso di esito positivo, non riscriviamo la riga nel file. Questo è il sunto, così apprendi meglio la logica. Questo è il codice d'esempio:

    [PHP]
    // recuperi i parametri in POST
    // Quindi prima di tutto effettui un controllo se POST è valorizzato, in caso contrario, non fai nulla
    if( $_POST != null ) {

    // a questo punto recuperiamo i dati
    $name = $_POST['name'];
    $pass = $_POST['password'];
    
    // ora eseguiamo lo stesso identico processo realizzato in precdenza
    // modificando i parametri di confronto
    
    $txt_file    = file_get_contents('path/to/file.txt');
    $rows        = explode("\n", $txt_file);
    
    unlink('path/to/file.txt');
    $new_file = fopen('path/to/file.txt', 'a+');
    foreach($rows as $row)
    {
        $data = explode(';', $row);
        //esempio, se il tuo valore data è la terza occorrenza
        if( $data[0] == $name && $data[1] == $pass ) {
            // non faccio nulla
        } else {
            fwrite( $new_file, $row . "\n" );
        }
    
    }
    fclose( $new_file );  
    

    }
    [/PHP]
    Detto questo però, dovresti dover aggiungere diversi controlli sui campi, così da non creare confusioni o tentativi malevoli di esecuzione del tuo script.
    Mi raccomando: prima di qualsiasi test, effettua sempre un backup dei dati, perchè il sistema, prima cancella e poi riscrive il file.
    Ciao e fammi sapere.


  • User

    Grazie, tu non sai quanto mi piaccia imparare cose nuove! Tranquillo, quanto alla sicurezza ho tutto sotto controllo nei form attivi; piuttosto esagero, ma non sottovaluto mai in questo campo. Grazie mille di nuovo, sei super :smile5:


  • User

    @Ultima said:

    [PHP]
    // recuperi i parametri in POST
    // Quindi prima di tutto effettui un controllo se POST è valorizzato, in caso contrario, non fai nulla
    if( $_POST != null ) {

    // a questo punto recuperiamo i dati
    $name = $_POST['name'];
    $pass = $_POST['password'];
    
    // ora eseguiamo lo stesso identico processo realizzato in precdenza
    // modificando i parametri di confronto
    
    $txt_file    = file_get_contents('path/to/file.txt');
    $rows        = explode("\n", $txt_file);
    
    unlink('path/to/file.txt');
    $new_file = fopen('path/to/file.txt', 'a+');
    foreach($rows as $row)
    {
        $data = explode(';', $row);
        //esempio, se il tuo valore data è la terza occorrenza
        if( $data[0] == $name && $data[1] == $pass ) {
            // non faccio nulla
        } else {
            fwrite( $new_file, $row . "\n" );
        }
    
    }
    fclose( $new_file );  
    

    }
    [/PHP]

    Ciao, sono ancora qui per una pignoleria. Il codice in oggetto funziona benissimo e mille grazie di nuovo a Ultima. Quando si cancella la riga, pero, rimane al suo posto lo spazio vuoto, cioe una riga vuota. Questo e inevitabile, o si puo eliminare lasciando, comunque, le righe incolonnate com'erano? Non e` una cosa grave, ma tanto per saperlo. Grazie ancora


  • Moderatore

    Ciao cosina. Fai bene ad essere pignola in questo lavoro.
    Io purtroppo quella porzione di codice l'ho scritta al volo diciamo da "spunto" più che da vera e propria soluzione. Per sistemarla completamente, dovrei fare dei test e fare il debug con il tuo file reale e cercare di capire dove scrive la riga vuota e soprattutto perchè.
    La sola cosa che mi viene da dirti è di aggiungere un controllo prima della funzione fwrite per verificare che $row non contenga un vuoto. Una cosa tipo questa:
    [PHP]
    if( $row != '' or ! empty($row) or $row != ' ' ) {
    fwite( $new_file, $row . "\n" );
    }
    [/PHP]
    Però ripeto, dovrei fare qualche debug sul file reale.
    Te, hai trovato rimedio?


  • User

    Ciao, non ho ancora trovato il rimedio. Sto cercando. Proprio adesso leggevo questa discussione: //stackoverflow.com/questions/17137286/remove-blank-lines-from-a-text-file , ma non ci capisco molto..
    Comunque la riga vuota, nel nuovo file txt, appare esattamente dove, nel file originario, c'era quella che viene cancellata


  • User

    Aspetta, pero. che faccio qualche altro test, perche non lo fa sempre, devo capire.


  • User

    Ok, credo di aver capito e risolto. Per fare i test utilizzavo l'ultima riga e, quando veniva scritta la riga successiva, saltava uno spazio. Se lo faccio sulle righe intermedie, invece, le scala correttamente. Dato che quelle da cancellare saranno sempre le righe piu` in alto, il problema non si pone. Grazie mille, sei stato gentilissimo. Ciao


  • Moderatore

    Bene, hai risolto!!!!
    Son contentissimo. 🙂


  • User

    Merito tuo per tutto, sei un grande!