Come eliminare l’ultima riga in un file di testo?

Ho un semplice log file di testo con estensione .txt con uno spazio bianco riga alla fine del file di testo ogni volta che il file di log viene generato da un 3 ° programma di partito.

Quindi c’è nessun metodo o i codici che posso utilizzare per eliminare l’ultima riga del file di testo?

Un esempio di log, file di testo:

Sun Jul 22 2001 02:37:46,73882,...b,r/rrwxrwxrwx,0,0,516-128-3,C:/WINDOWS/Help/digiras.chm
Sun Jul 22 2001 02:44:18,10483,...b,r/rrwxrwxrwx,0,0,480-128-3,C:/WINDOWS/Help/cyycoins.chm
Sun Jul 22 2001 02:45:32,10743,...b,r/rrwxrwxrwx,0,0,482-128-3,C:/WINDOWS/Help/cyzcoins.chm
Sun Jul 22 2001 04:26:14,174020,...b,r/rrwxrwxrwx,0,0,798-128-3,C:/WINDOWS/system32/spool/drivers/color/kodak_dc.icm
Date un’occhiata qui: stackoverflow.com/questions/532217/…, di eliminare l’ultima riga dovrebbe essere come l’eliminazione di qualsiasi altra linea.

OriginaleL’autore JavaNoob | 2010-11-24

4 Replies
  1. 20

    Come a qualcosa del genere :

    var lines = System.IO.File.ReadAllLines("...");
    System.IO.File.WriteAllLines("...", lines.Take(lines.Length - 1).ToArray());

    Spiegazione:

    Tecnicamente, non si elimina una riga da un file. Leggere il contenuto di un file e li riscrive escluso il contenuto che si desidera eliminare.

    Che cosa fa questo codice è leggere tutte le righe in un array, e scrivere queste righe nel file escludendo solo l’ultima riga. (Prendere) metodo (Parte di LINQ) prende il numero di righe specificato che, nel nostro caso, è di lunghezza – 1). Qui, var lines può essere letto come String[] lines.

    Tizio può spiegare i codici? Grazie
    Spiegazione aggiunto.
    File.ReadAllLines è bene per file di piccole dimensioni, ma si desidera utilizzarlo se il file conteneva un milione di righe?
    No, io non lo consiglio. Vorrei quindi consigliabile l’uso di ReadLine() e WriteLine (), invece.
    Sì ho potuto leggere ReadLine troppo solo bisogno di un paio di piccoli aggiustamenti alla matrice per ReadAllLines… Grazie per la risposta!!

    OriginaleL’autore decyclone

  2. 10

    Utilizzare questo metodo per rimuovere l’ultima riga del file:

    public static void DeleteLastLine(string filepath)
    {
        List<string> lines = File.ReadAllLines(filepath).ToList();
    
        File.WriteAllLines(filepath, lines.GetRange(0, lines.Count - 1).ToArray());
    
    }

    Edit: Capito le linee variabile non esisteva in precedenza, così ho aggiornato il codice.

    Aggiungere rep per la risposta corretta!
    In effetti si sta inutilmente scorrendo le righe per due volte (tre se si conta la scrittura), perché si stanno convertendo alla lista quando non è necessario e quindi si sono di conversione in un array.

    OriginaleL’autore Miguel

  3. 3

    Se si desidera eliminare le ultime N righe da un file senza caricare tutto in memoria:

    int numLastLinesToIgnore = 10;
    string line = null;
    Queue<string> deferredLines = new Queue<string>();
    using (TextReader inputReader = new StreamReader(inputStream))
    using (TextWriter outputReader = new StreamWriter(outputStream))
    {
        while ((line = inputReader.ReadLine()) != null)
        {
            if (deferredLines.Count() == numLastLinesToIgnore)
            {
                outputReader.WriteLine(deferredLines.Dequeue());
            }
    
            deferredLines.Enqueue(line);
        }
        //At this point, lines still in Queue get lost and won't be written
    }

    Quello che succede è che si buffer di ogni nuova riga in Coda, con una dimensione numLastLinesToIgnore e pop una linea di scrivere solo quando la Coda è piena. Si effettivamente read-ahead il file, e sono in grado di interrompere numLastLinesToIgnore righe prima della fine del file viene raggiunto, senza conoscere il numero totale di linee in anticipo.

    Nota che se il testo ha meno di numLastLinesToIgnore, il risultato è vuoto.

    Mi è venuto con esso come uno specchio soluzione a questo:
    Cancella riga da un file di testo?

    Questa è davvero la strada da percorrere se si dispone di poca memoria e potenza di elaborazione disponibile!

    OriginaleL’autore ARrigo

  4. 2

    Non è possibile eliminare la riga finale, come File.WriteAllLines aggiunge automaticamente, tuttavia, è possibile utilizzare questo metodo:

    public static void WriteAllLinesBetter(string path, params string[] lines)
    {
        if (path == null)
            throw new ArgumentNullException("path");
        if (lines == null)
            throw new ArgumentNullException("lines");
    
        using (var stream = File.OpenWrite(path))
        using (StreamWriter writer = new StreamWriter(stream))
        {
            if (lines.Length > 0)
            {
                for (int i = 0; i < lines.Length - 1; i++)
                {
                    writer.WriteLine(lines[i]);
                }
                writer.Write(lines[lines.Length - 1]);
            }
        }
    }

    Questo non è mio, l’ho trovato a .NET File.WriteAllLines lascia una riga vuota alla fine del file

    OriginaleL’autore Bean

Lascia un commento