2014-12-07 7 views
15

więc nie mogę tego zrobić, MyFile.txt ma albo "angielski", "francuski" lub "niemiecki" w pierwszej linii i chcę uzyskać język z pierwszy wiersz pliku tekstowego, a następnie kontynuować mój kodCzytaj tylko pierwszy wiersz z pliku tekstowego

String[] languages = new String[] { "english", "french", "german"}; 

foreach (String language in languages) 
{ 
    string line1 = File.ReadLines("MyFile.txt").Skip(0).Take(1); 
    line1 = language; 
    continue; 
} 
+0

sprawdź ten wpis: http://stackoverflow.com/questions/9439733/read-only-the-fewst-few-lines-of-text-from-a-file – abdo

Odpowiedz

29

należy wykorzystać File.ReadLines razem z Enumerable.First. Gwarantuje przeczytanie tylko pierwszej linii z pliku.

using System.Linq; 

...

string line1 = File.ReadLines("MyFile.txt").First(); // gets the first line from file. 

różnicy do File.ReadAllLines jest, że File.ReadLines korzysta z oceny leniwy i robi pierwszy odczytać pliku Wole na tablicę wierszy.

+0

"System.IO.File" nie zawierają definicję "ReadLines" – user3542613

+0

Zastąpiłem ReadLines ReadAllLines, błąd w powyższym komentarzu zniknął, ale teraz kod poniżej "continue;" jest nieosiągalny – user3542613

+0

Dlaczego ta odpowiedź nie została bardziej wznowiona? – fjardon

34

Aby skomentować użycie ReadAllLines() w komentarzu OP do odpowiedzi CSharpie; może to mieć ogromny wpływ na wydajność, jeśli MyFile.txt jest bardzo dużym plikiem.

File.ReadAllLines().First() będzie faktycznie czytać wszystkie linii, przechowywać je w string[], a następnie podjąć pierwszą. Dlatego jeśli twój plik jest bardzo duży, zapisze wszystkie te linie w tablicy, co może trochę potrwać.

Alternatywną i skuteczniejszą opcją byłoby po prostu otwarcie StreamReader i przeczytanie tylko pierwszej linii. Właściwa implementacja byłaby;

String[] languages = new String[] { "english", "french", "german"}; 
string firstLine; 

using(StreamReader reader = new StreamReader("MyFile.txt")) 
{ 
    firstLine = reader.ReadLine() ?? ""; 
} 

if(languages.Contains(firstLine)) 
{ 
    //... 
} 

Zastosowanie using zadba o zamknięciu i likwidacji czytelnika. Ponadto użycie ?? spowoduje, że null nigdy nie zostanie zwrócony (a tym samym zaoszczędzisz ArgumentNullException na Contains()).

+0

Nie użyłem File.ReadAllLines, ale File.ReadLines. – CSharpie

+0

@Sharpie, moje złe, przeczytaj komentarz PO i zakładam, że użył 'ReadAllLines()'. Edytowałem to w mojej odpowiedzi! –

2

Choć post jest od 2014 roku, bardziej wydajne rozwiązanie wykorzystujące nowsze metody może być to jedno:

System.IO.StreamReader readingFile = new System.IO.StreamReader(filePath); 

string readingLine = readingFile.ReadLine(); 

W ten sposób można zapobiec przeczytaniu kilku wierszy i konieczności dostać się pierwszy z LINQ.

+0

Czy ta metoda istniała w 2014 roku? [Tutaj] (https://msdn.microsoft.com/fr-fr/library/system.io.streamreader (v = vs.110) .aspx), daty dokumentacji 2016. –

+0

Nie dostrzegłem daty pierwotnego pytania, dopóki nie opublikowałem odpowiedzi, jednak nie usunąłem go, ponieważ mogło to być korzystne dla kogoś innego, zredagowałem odpowiedź, aby wyjaśnić tę kwestię. – KeOt777

+0

To jest tak samo jak odpowiedź Diona V. – CSharpie

Powiązane problemy