È un modo efficace per rimuovere tutte le righe da un file che non contiene una stringa certa? [chiuso]

-3

Il titolo dice tutto - Sto provando a rimuovere ogni riga da un file che contiene la stringa "PresenceManager". Per prima cosa cerco attraverso il file, rimuovendo qualsiasi istanza della stringa. Tuttavia, questo lascia un TON di righe vuote, quindi devo andare e rimuovere quelli con un altro blocco di codice. Questo sembra un bel po 'di codice per fare un compito apparentemente facile. È il loro modo di abbreviare / ottimizzare questo?

 public static void checkDirtyLogs(Skype s, Form1 f1)
    {
        foreach (string log in Directory.GetFiles(f1.path, "debug*.log"))
        {

            string[] currentFile = File.ReadAllLines(log);

            for (int i = 0; i < currentFile.Length - 1; i++)
            {
                if (!currentFile[i].Contains("PresenceManager"))
                {
                    currentFile[i] = "";
                }
            }

            File.WriteAllLines(log, currentFile);

            var tempFileName = Path.GetTempFileName();
            try
            {
                using (var streamReader = new StreamReader(log))
                using (var streamWriter = new StreamWriter(tempFileName))
                {
                    string line;
                    while ((line = streamReader.ReadLine()) != null)
                    {
                        if (!string.IsNullOrWhiteSpace(line))
                            streamWriter.WriteLine(line);
                    }
                }
                File.Copy(tempFileName, log, true);
            }
            finally
            {
                File.Delete(tempFileName);
            }

        }

    } //Clean logs
    
posta lol 08.09.2016 - 01:32
fonte

2 risposte

3

1) Crea due flussi, uno con l'input e uno con l'output:

using(var reader = new StreamReader(log))
using(var writer = new StreamWriter(tempFile))

2) Leggi ogni riga da reader , controllala e scrivi allo scrittore se passa

while((line = reader.ReadLine()) != null)
{
     if(!line.Contains("PresenceManager"))
     {
         writer.WriteLine(line);
     }
}

3) Elimina il file di registro e sostituiscilo con il file temporaneo.

Oppure controlla questa risposta di powershell per un solo rivestimento.

    
risposta data 08.09.2016 - 01:41
fonte
2

Se il tuo file è abbastanza piccolo da stare facilmente nella memoria, tenderei a cercare qualcosa del tipo:

var allLines = File.ReadAllLines(log);
var filteredLines = allLines.Where(x => !x.Contains("PresenceManager"))
File.WriteAllLines(log, filteredLines)
    
risposta data 08.09.2016 - 02:27
fonte

Leggi altre domande sui tag