2011-08-10 13 views
8

mogę obecnie usunąć ostatni wiersz pliku tekstowego przy użyciu:Usuwanie pierwszy wiersz pliku tekstowego w C#

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

Chociaż, jak to możliwe, aby zamiast usunąć początek pliku tekstowego?

+0

Może nie odpowiedź, której szukasz, ale co powiesz na zamianę bajtów reprezentujących pierwszy wiersz na NULL? Następnym razem, gdy możesz File.ReadAllLines, pominiesz wszystkie początkowe bajty NULL. – Polity

Odpowiedz

8

Zamiast lines.Take można zamiast tego użyć, lines.Skip jak:

var lines = File.ReadAllLines("test.txt"); 
File.WriteAllLines("test.txt", lines.Skip(1).ToArray()); 

obciąć na początku pomimo faktu, że zastosowana technika (czytaj cały tekst i pisać wszystko z powrotem) jest bardzo nieefektywne.

O skutecznym sposobie: Nieefektywność wynika z konieczności przeczytania całego pliku w pamięci. Na odwrót można łatwo wyszukać w strumieniu i skopiować strumień do innego pliku wyjściowego, usunąć oryginał i zmienić nazwę starego. Ten byłby równie szybki i jednocześnie zużywał znacznie mniej pamięci.

Skracanie pliku na końcu jest znacznie łatwiejsze. Możesz po prostu znaleźć pozycję cięcia i zadzwonić pod numer FileStream.SetLength().

+1

Jest to nieefektywne tak - ale czy istnieje sposób na skrócenie początku pliku? –

+0

Tak, po prostu pomijasz pisanie tego, jak stwierdzono w mojej odpowiedzi. –

+2

@ssg: Jeśli pominiesz część do pisania, to w jaki sposób plik zostanie zaktualizowany? Zakładam, że czegoś mi brakuje ... – Chris

4
var lines = System.IO.File.ReadAllLines("test.txt"); 
System.IO.File.WriteAllLines("test.txt", lines.Skip(1).ToArray()); 

Skip eliminuje daną liczbę elementów z rozpoczynających sekwencji. Take eliminuje wszystkie oprócz podanej liczby elementów z koniec sekwencji.

4

Oto alternatywa:

 using (var stream = File.OpenRead("C:\\yourfile")) 
     { 
      var items = new LinkedList<string>(); 
      using (var reader = new StreamReader(stream)) 
      { 
       reader.ReadLine(); // skip one line 
       string line; 
       while ((line = reader.ReadLine()) != null) 
       { 
        //it's far better to do the actual processing here 
        items.AddLast(line); 
       } 
      } 
     } 

Aktualizacja

Jeśli potrzebujesz IEnumerable<string> i nie chcą tracić pamięć można zrobić coś takiego:

public static IEnumerable<string> GetFileLines(string filename) 
    { 
     using (var stream = File.OpenRead(filename)) 
     { 
      using (var reader = new StreamReader(stream)) 
      { 
       reader.ReadLine(); // skip one line 
       string line; 
       while ((line = reader.ReadLine()) != null) 
       { 
        yield return line; 
       } 
      } 
     } 
    } 


    static void Main(string[] args) 
    { 
     foreach (var line in GetFileLines("C:\\yourfile.txt")) 
     { 
      // do something with the line here. 
     } 
    } 
+1

Co się stanie, jeśli nie ma linii? – Deleted

+1

nic, ponieważ 'ReadLine' zwraca null dla obu połączeń. – jgauffin

+0

Sprytny. Ma doskonały sens. – Deleted

0

Aby usunąć pierwszą linię z pliku tekstowego

System.IO.StreamReader file = new System.IO.StreamReader(filePath); 
string data = file.ReadToEnd(); 
file.Close(); 
data = Regex.Replace(data, "<.*\n", ""); 
System.IO.StreamWriter file = new System.IO.StreamWriter(filePath, false); 
file.Write(data); 
file.Close(); 
+1

Regex jest naprawdę przesadny w tym scenariuszu – mike

Powiązane problemy