Czy istnieje prosty sposób programowo określić liczbę wierszy w pliku tekstowym?
źródło
Czy istnieje prosty sposób programowo określić liczbę wierszy w pliku tekstowym?
Poważnie spóźniona edycja: jeśli używasz .NET 4.0 lub nowszej wersji
File
Klasa ma nową ReadLines
metodę, która leniwie wylicza linie zamiast łapczywie czytać je wszystkie do tablicy podobnego ReadAllLines
. Teraz możesz zyskać zarówno skuteczność, jak i zwięzłość dzięki:
var lineCount = File.ReadLines(@"C:\file.txt").Count();
Oryginalna odpowiedź
Jeśli nie przejmujesz się wydajnością, możesz po prostu napisać:
var lineCount = File.ReadAllLines(@"C:\file.txt").Length;
Aby uzyskać bardziej wydajną metodę, możesz:
var lineCount = 0;
using (var reader = File.OpenText(@"C:\file.txt"))
{
while (reader.ReadLine() != null)
{
lineCount++;
}
}
Edycja: w odpowiedzi na pytania dotyczące wydajności
Powodem, dla którego powiedziałem, że drugi był bardziej wydajny, było zużycie pamięci, niekoniecznie szybkość. Pierwszy ładuje całą zawartość pliku do tablicy, co oznacza, że musi on przydzielić co najmniej tyle pamięci, ile rozmiar pliku. Drugi zapętla tylko jedną linię na raz, więc nigdy nie musi przydzielać więcej niż jednej pamięci na raz. Nie jest to tak ważne w przypadku małych plików, ale w przypadku większych plików może to stanowić problem (jeśli spróbujesz znaleźć liczbę wierszy w pliku 4 GB w systemie 32-bitowym, na przykład tam, gdzie po prostu nie wystarczy przestrzeń adresowa trybu użytkownika do przydzielenia tak dużej tablicy).
Pod względem prędkości nie spodziewałbym się, że będzie w tym wiele. Możliwe, że ReadAllLines ma pewne wewnętrzne optymalizacje, ale z drugiej strony może być konieczne przydzielenie ogromnej ilości pamięci. Sądzę, że ReadAllLines może być szybszy dla małych plików, ale znacznie wolniejszy dla dużych plików; chociaż jedynym sposobem na określenie tego byłoby zmierzenie go za pomocą stopera lub profilera kodu.
ReadLines().Count()
, musisz dodać ausing System.Linq
do swoich załączników. Wymaganie tego dodatku wydawało się dość nieintuicyjne, dlatego o tym wspominam. Jeśli korzystasz z programu Visual Studio, prawdopodobnie dodawanie jest wykonywane automatycznie.Najłatwiejszym:
źródło
Zużyłoby to mniej pamięci, ale prawdopodobnie potrwa dłużej
źródło
Jeśli przez „easy” rozumiesz linie kodu, które można łatwo odszyfrować, ale przypadkowo są nieefektywne?
To prawdopodobnie najszybszy sposób, aby dowiedzieć się, ile linii.
Możesz także zrobić (w zależności od tego, czy buforujesz)
Istnieje wiele innych sposobów, ale prawdopodobnie jednym z powyższych jest to, co wybierzesz.
źródło
Możesz szybko go odczytać i zwiększyć licznik, po prostu użyj pętli, aby zwiększyć, nie robiąc nic z tekstem.
źródło
Wczytanie pliku samo w sobie zajmuje trochę czasu, zbieranie śmieci jest kolejnym problemem, ponieważ czytasz cały plik, aby policzyć znaki nowego wiersza,
W pewnym momencie ktoś będzie musiał odczytać znaki w pliku, niezależnie od tego, czy jest to framework, czy też jest to twój kod. Oznacza to, że musisz otworzyć plik i wczytać go do pamięci, jeśli plik jest duży, może to stanowić problem, ponieważ pamięć musi zostać wyrzucona.
Nima Ara dokonała miłej analizy, którą możesz wziąć pod uwagę
Oto proponowane rozwiązanie, ponieważ odczytuje 4 znaki na raz, liczy znak nowego wiersza i ponownie używa tego samego adresu pamięci ponownie do następnego porównania znaków.
Powyżej widać, że linia jest odczytywana po jednym znaku na raz przez podstawową strukturę, ponieważ musisz odczytać wszystkie znaki, aby zobaczyć linię.
Jeśli profilujesz to jako zrobione bay Nima, zobaczysz, że jest to dość szybki i wydajny sposób na zrobienie tego.
źródło
policz powroty karetki / linie. Wierzę, że w Unicode wciąż są odpowiednio 0x000D i 0x000A. w ten sposób możesz być tak wydajny lub tak mało wydajny, jak chcesz i zdecydować, czy masz do czynienia z obiema postaciami, czy nie
źródło
Opcją realną i taką, z której osobiście korzystałem, byłoby dodanie własnego nagłówka do pierwszego wiersza pliku. Zrobiłem to dla niestandardowego formatu modelu dla mojej gry. Zasadniczo mam narzędzie, które optymalizuje moje pliki .obj, pozbywając się bzdur, których nie potrzebuję, konwertuje je na lepszy układ, a następnie zapisuje całkowitą liczbę linii, twarzy, normalnych, wierzchołków i UV tekstury na pierwsza linia. Dane te są następnie wykorzystywane przez różne bufory tablicowe podczas ładowania modelu.
Jest to również przydatne, ponieważ wystarczy raz zapętlić plik, aby go załadować, zamiast raz, aby policzyć linie, i ponownie, aby odczytać dane do utworzonych buforów.
źródło
źródło
Możesz uruchomić plik wykonywalny „ wc .exe” (dostarczany z UnixUtils i nie wymaga instalacji) uruchamiany jako proces zewnętrzny. Obsługuje różne metody zliczania linii (takie jak Unix vs Mac vs Windows).
źródło