liczba linii w pliku

0

chciałbym w pliku tekstowym zliczyć ile jest linii
może lepiej opisze do czego mi to
mam plik tekstowy, załóżmy że każda linia to rekord
chciałbym ten plik z n rekordami podzielić na kilka mniejszych, tak żeby podział był mniej więcej równy
czyli jeśli rekordów jest 22, a podział ma być na 4 pliki, to do pierwszych trzech plików ląduje po 6 rekordów, a do ostatniego 4
znam rozmiar pliku wejściowego, ale nie wiem ile jest w nim rekordów, nawet przy założeniu, że każdy rekord ma stałą liczbę znaków to używając UTF-8 nie uzyskam tej informacji z FileSize / RecordSize

mógłbym otworzyć 4 StreamWritery i pisać po kolei do kazdego po jednym rekordzie, ale jesli miałoby się okazać ze musze ich mieć 1000, to już mi się to nie widzi, wolałbym w danej chwili mieć otwarty tylko jeden writer
generalnie chodzi też o wydajność, wiec wolalbym nie przelatywać pliku wejsciowego i liczyc ile jest rekordów, a później cofać się na początek i wykonywać podział

ma ktoś jakieś sugestie?

0
Ozz napisał(a)

wolalbym nie przelatywać pliku wejsciowego i liczyc ile jest rekordów, a później cofać się na początek i wykonywać podział

inaczej się nie da - trzeba te linie (znaki końca linii dokładniej) po prostu zliczyć

0

Jak duży jest ten plik?

0

Witam

W przypadku pracy ze systemem Linux nie byłoby problemu z policzeniem liczby wierszy.
Wśród wielu programów narzędziowych systemów "linuksowych" i "uniksowych" służacych
do obróbki pliku tekstowego istnieje również program o nazwie WC ( skrót od "words
counter" ) ; programu tego można użyć do zliczenia liczby wierszy pliku tekstowego
według składni następującej :

 wc -l nazwa_pliku
 

Pełen zestaw tego typu narzędzi, wzorowanych na "linuksowych", ale działających pod
systemem Windows można znaleźć pod adresem :

http://www.freedownloadscenter.com/Programming/Misc__Programming_Tools/UnixDos_Toolkit_for_Windows.html

                                                 Pozdrawiam
                                                 
                                                  JK
1

<_< W przypadku pracy pod systemem Windows również nie będzie problemu z policzeniem liczby wierszy...

Wow, administratorzy (thx 2 deus) to mają tempo... Z powodu padu serwera 4p post został wysłany dwa razy, a kiedy odświeżyłem stronę zdublowany post był już usunięty... Strach się bać.

0

rzeczywisty plik może liczyć kilkadziesiąt milionów rekordów
każdy rekord to średnio 120-200 znaków (mogą być i takie po 500-800)
generalnie chodzi o podział pliku na wiele małych po max 5 mln rekordów, w celu posortowania, jaki podział bedzie najbardziej optymalny wyjdzie jeszcze w testach, ale ze wstepnych testów 5 mln wydaje się ograniczeniem górnym

oczywiście mógłbym wykonać te operacji w C++, ale wymóg jest aby było to w C#

0

Jeśli potrzebna Ci dokładna informacja o ilości rekordów - nie ma innego wyjścia, musisz przelecieć przez cały plik.
Natomiast jeśli chcesz podzielić jeden wielki plik na X mniejszych o mniej więcej takim samym rozmiarze:

  • pobierasz informacje o rozmiarze pliku-matki, dzielisz to na X - otrzymujesz przybliżony rozmiar każdego z nowych plików
  • zaczynasz odczyt z pliku-matki i zapis do pliku-dziecka sprawdzając jego rozmiar (o ile to możliwe gdy jest otwarty, ale raczej tak) albo ilość zapisanych danych
  • po osiągnięciu celu zamykasz plik-dziecko i rozpoczynasz kolejny.
0

No ok, ale zliczenie 5 mln wierszy zajmuje na moim kompie (i5 750) 2 sekundy...

1

Jeśli ci tak zależy na szybkości to może stwórz kolejny plik do którego będziesz zapisywał liczbę wierszy i modyfikował przy dodawaniu nowych?

0

Witam

Pod Windows rzeczywiście jest do zrobienia ; wystarczy się posłużyć tzw. "edytorami dla programistów"
( Crimson Editor , TextPad , itp. ), z których każdy posiada opcję numerowania wierszy edytowanego pliku. Zatem skacząc na koniec pliku, będziemy wiedzieć, ile wierszy - rekordów on zawiera. W tym konkretnym przypadku warto byłoby użyć tzw. Mass File Editor :

http://mass-file-editor.software.informer.com/2.2/

Do dzielenia pliku tekstowego na mniejsze pliki można użyć takich narzędzi :

 http://split-text-files-into-multiple-files-sof.software.informer.com/7.0/

http://www.textmaster.ca/filesplit/download.html

                                                                              Pozdrawiam

                                                                                 JK
0

Ee.... nie wiem czy wiesz ale z tego co ja wiem to wiem że każde IDE którego sens jest używać ma numerowanie lini, a także wiem iż prosty notatnik z Windowsika ma liczenie lini.

Inną sprawą jest że to program ma wiedzieć ile tych lini jest, mam nadzieję że nie proponujesz by progsik używał zewnętrznego softu do liczenia lini...

Co do dzielenia pliku, wierzę że większości tu obecnych mniej czasu zejdzie na napisanie tych kilku lini niż na ściągania i ogarnianie obcego sofciku :>

Pomysł MSM bym zmodyfikował na dodanie nagłówka do pliku - dwa pliki to zło.
Skoro plik jest robiony przez program to gdy nagłówek się nie zgadza to po prostu error: Ktoś popsuł plik! Bić Saracena!

1

Pomysł MSM bym zmodyfikował na dodanie nagłówka do pliku - dwa pliki to zło.

W sumie wiem... Ale skoro plik ma być tekstowy to kto wie co userowi do głowy wpadnie.

@koniaku - miałem na myśli coś w rodzaju plik.Split("\r\n").Count, ale jeśli nie chcesz programistycznie to przykładowy spodób na zrobienie tego pod Windows (lekko szalony ale działa):

find /c /v "A*#NfMC*#Ja(dowolny_dziwny_tekst)sdOAF(J" plik.txt

0

Witam

Pomysł z find jest oryginalny ; jeszcze bardziej można byłoby zaszaleć z programem AWK ;
wiem, że w przypadku Windows jest on niestandartowy, ale miłośnicy tego rodzaju softu przygotowali
jego wersję pod Windows :

http://gnuwin32.sourceforge.net/packages/gawk.htm

Podział rozwiązań na : "obcy soft" i na własne rozwiązanie programistyczne jest chyba trochę sztuczny,
bo gdyby program "główny" był pisany w PERLu, to mógłby "przechwycić" komunikat wygenerowany przez skrypt AWK.

                                                                                   Pozdrawiam

                                                                                        JK
0

no to jak tak, po moze pod winda powershell uzyc
z gory mowie ze wiele skryptow etc. w nim nie pisalem, ale warto sprawdzic i porownac wydajnosc

chodzi o podział pliku na wiele małych ... w celu posortowania

sadze ze to sugeruje ze plik dzielony jest tylko na chwile, aby mozna bylo te male kawalki wczytac do pamieci, posortowac, moze nawet w kilku watkach, a pozniej zlaczyc w jeden posortowany
ja tak to zrozumialem
wiec osobny plik z liczba wierszy jest raczej zbedny

0

Awr :D
Czyli co? Jak chce zrobić coś co zajmie mi z tuzin lini kodu to zamiast wstukać to w minutę to mam łazić po googlu i szukać czy nie ma jakiegoś progsa co zrobi to samo zużywając więcej czasu niż na zrobienie tego "ręcznie"?
Chyba mi nie powiesz że za każdym razem jak chcesz zliczyć linie w pliku to wołasz coś z tego co wymieniłeś :> Tożto więcej kodu zejdzie na to niż na pętelke co to policzy :>

0
muhmuhmuh napisał(a)

chce zrobić coś co zajmie mi z tuzin lini kodu

Jesteś pewien, że tyle wystarczy? Pokaż rozwiązanie na tuzin linii kodu, zobaczymy. :)

0

chodzi mi o rozwiazanie softwarowe, które będzie częścią większej całości
bo jak mam do przetworzenia dziennie kilkadziesiat, czy kilkaset plików o rozmiarach licznonych w setkach MB lub nawet kilku GB, to chyba nie sadzicie że będę to otwierał w notatniku liczyl linie, a później może jeszcze ręcznie posortuje te pliki? :)

generalnie StreamReader'em czytam ReadLine i inkrementuje zmienna zliczajaca
pozniej wracam na poczatek pliku (po bedzie on dalej przetwarzany) i zwracam liczbe wierszy

0

Witam ponownie

Z pierwszego postu inicjującego tę dyskusję nie wynikało, że to liczenie wierszy - rekordów
w wielgachnym pliku tekstowym, a następnie dzielenie go na "podpliki" miałoby być
operacją wielokrotną ( gdyby to miała być operacja jednorazowa, to wówczas rzeczywiście
warto byłoby skorzystać z jakichś "gotowców" ). Jeżeli ma to być operacja wielokrotnie
powtarzalna, to "jądro" tej operacji może warto napisać jako skrypt AWK :

http://awk.of.pl/

http://pinkaccordions.homelinux.org/staff/tp/prog/awk/awk-intro/awk-man.html

http://www.grymoire.com/Unix/Awk.html

http://www.gnu.org/manual/gawk/gawk.html

Program "zewnętrzny" ( program "główny" ) mógłby wywoływać taki skrypt np. funkcją "system".
Z narzędziem AWK nie powinno być kłopotów w systemach 'linuksowych' ; w przypadku systemu
Windows można takie narzędzie ściągnąć z Sieci ( patrz parę postów wcześniej ).

                                                                 Pozdrawiam
                                                                 
                                                                  JK

1 użytkowników online, w tym zalogowanych: 0, gości: 1