Cancellare linee di testo se il numero supera un tot

di il
4 risposte

Cancellare linee di testo se il numero supera un tot

Mi spiego: ho un file.html in cui arrivano dei dati inviati tramite un modulo e si dispongono su righe incolonnate in ordine di data con i più vecchi in alto. Vorrei cancellare parte dei vecchi dati in modo che nel file rimanesse sempre lo stesso numero di righe (es. 50). Come devo fare? Ho cercato in rete, ma ho trovato solo cose del tipo "cancella le prime 10 righe", o le ultime. Grazie per l'aiuto

4 Risposte

  • Re: Cancellare linee di testo se il numero supera un tot

    Devi assicurarti che il file originale (non basta tramite l'aiuto del codice php) sia effettivamente in ordine ascendente in base alla data, le operazioni su file non sono molte. Solo a scopo illustrativo guarda il mode di fopen https://www.php.net/manual/en/function.fopen.ph (è normale che all'inizio non avrai le idee chiare).
    In teoria devi filtrate gli ultimi 50 risultati più aggiornati e eliminare il resto.
    Nel ciclo for o foreach sicuramente avrai visto un numero intero che interrompe lo scorrimento di ulteriori dati.
    Posta il codice per favore e te lo modifico.
    Mi occorre anche la struttura del file originale (solo le prime due righe iniziali del file originale dal momento che le righe successive sono una ripetizione con la stessa struttura ma con data diversa).. poi in un secondo momento sarebbe da adattare come il codice di creazione (coerenza nell'uso da parte di uno script).
  • Re: Cancellare linee di testo se il numero supera un tot

    I dati sono in ordine ascendente, cioè il più vecchio è in alto e il più nuovo in basso. Non ho capito bene cosa devo darti, comunque il codice che scrive i dati nel file è questo:
    
    include("setting.php");
    if(isset($_POST['scrivi']))
    	{
    	if(!is_writable($my_database)){
    		exit("il file non ha i permessi di scrittura!");
    		}
    	// riceviamo i dati e li filtriamo
    	$bad_char = array("|", "\r\n", "\r", "\n");
    	$name = htmlentities(str_replace($bad_char, "", $_POST['name']));
    	$message = htmlentities(str_replace($bad_char, "", $_POST['message']));
    	$date = new DateTime();
        $date = $date->format("d.m.y - h:i:s");
        
    	// apriamo il file
    	$open = fopen($my_database, "a+");
    	// scriviamo i dati separati dal carattere separatore
    	fwrite($open, "<span style='color:red; font-weight:bold; font-size:12pt;'>".$name."</span>"."<br>".$date."<br>"."<em>".$message."</em>"."<hr>"."\r\n");
    	
    	// chiudiamo il file
    	fclose($open);
    
    	// ritorniamo nella pagina di visualizzazione
    	header("location: form_insert.html");
    	exit;
    	}
    Le righe del file html di arrivo sono messe in questo modo:

    <span style='color:red; font-weight:bold; font-size:12pt;'>Nome</span><br>07.05.20 - 12:56:05<br><em>prima prova</em><hr>
    <span style='color:red; font-weight:bold; font-size:12pt;'>Nome2</span><br>07.05.20 - 04:53:26<br><em>seconda prova</em><hr>
    <span style='color:red; font-weight:bold; font-size:12pt;'>Nome3</span><br>08.05.20 - 11:11:46<br><em>terza prova</em><hr>

    Il file setting.php ha questo contenuto:

    $my_database = 'file.html';

    Se serve altro fammi sapere che domani te lo mando. Grazie mille
  • Re: Cancellare linee di testo se il numero supera un tot

    Ciao scusa ho avuto un un'imprevisto.
    Per utilizzare questo codice occorre file.html in ordine decrescente e tutti i vari file collegati.

    file.html
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <title></title>
      <style>
      span {font-weight: bold; font-size:12pt; color: red;}
      </style>
    </head>
    <body>
    <span>Nome3</span><br>08.05.20  - 11:11:46<br><em>terza prova</em><hr>
    <span>Nome2</span><br>07.05.20 - 12:56:05<br><em>seconda prova</em><hr>
    <span>Nome</span><br>07.05.20 - 04:53:26<br><em>prima prova</em><hr>
    </body>
    </html>
    file che riceve i dati dal form con method POST
    <?php
    if(isset($_POST['scrivi'],$_POST['name'],$_POST['message']))
    	{
    	if(!is_writable($my_database)){
    		exit("il file non ha i permessi di scrittura!");
    		}
    	// riceviamo i dati e li filtriamo
    	$bad_char = array("|", "\r\n", "\r", "\n");
    	$name = htmlentities(str_replace($bad_char, "", $_POST['name']));
    	$message = htmlentities(str_replace($bad_char, "", $_POST['message']));
    	$date = new DateTime();
        $date = $date->format("d.m.y - h:i:s");
        
    	// apriamo il file
    	$open = fopen($my_database, "rb");
            // leggiamo il file
            $content = str_replace(array("\r","\n\n"),"\n",fread($open,filesize($my_database)));
            $content = substr($content,strpos($content,'<body>') + 6);
            $contents = explode("\n",$content);
            fclose($open);
    	// scriviamo i dati
           $open = fopen($my_database,"wb");
            fwrite($open, '<!DOCTYPE html>'."\n".'<html>'."\n". ' <head>'."\n".'  <meta charset="utf-8">'."\n".'  <title>test</title>'."\n".'   <style>'."\n".'  span {font-weight: bold; font-size:12pt; color: red;}'."\n".'  </style>'."\n".' </head>'."\n".'<body>'."\n");
    
            $string = "<span>".$name."</span>"."<br>".$date."<br>"."<em>".$message."</em>"."<hr>";
           $count = count($contents);
           $stop = $count > 1 ? $count - 3 : $count -1;
    	do {
    fwrite($open, $string);
    fwrite($open, "\n");
            } while (($var = key($contents)) <= 50 && ($string = next($contents)) && $stop >= $var);
    
            fwrite($open, '</body>'."\n".'</html>');
    	
    	// chiudiamo il file
            clearstatcache();
    	fclose($open);
    
    	// ritorniamo nella pagina di visualizzazione
    	header("location: form_insert.html");
    	exit;
    	}
  • Re: Cancellare linee di testo se il numero supera un tot

    Non devi scusarti, ci mancherebbe (anch'io ho visto ora, molto più tardi di te....momentaccio), anzi, ti ringrazio. Farò prove nei prossimi giorni. Ciao
Devi accedere o registrarti per scrivere nel forum
4 risposte