Strona 1 z 1

Jak odczytać cześć pliku od końca

: 27 wrz 2011 15:41
autor: kapitan7
Witam,

Jak do tej pory myślałem że to kwestia bardziej niż banalna. Ba miałem pewność że taka funkcja jest dostępna w LV i już kiedyś z niej korzystałem...
Przeszukałem halpa... przeszukałem forum.... i tak myślę że albo wpisywałem błędne hasła wyszukiwania albo nic na ten temat nie ma (to drugi raczej dziwne bo taka funkcja pewnie nie jednemu by sie przydała).

Mam większy plik tekstowy(tak około 30 MB).
W mojej aplikacji jest około 30 różnych takich plików(tej samej wielkości) które będę musiał kontrolować co minutę.
Potrzebuję odczytać ostatnie sto wierszy z każdego pliku co minutę.

Jak to zrobić?
Używam LV 8.2 i nie znalazłem nic co by pomogło rozwiązać ten problem?
Myślałem nad zrobieniem podprogramu który będzie "przechwytywał" dane dopisywane do plików tekstowych i trzymał je w jakiejś komórce lokalnej ale... nie będzie to dobrze rozwiązanie ponieważ przy restarcie programu komórka będzie pusta lub będzie zawierać nieaktualne dane.
Pozostaje wg mnie tylko odczyt końca pliku - czy ktoś ma jakieś pomysły jak to zrobić?

Dodaj to swojego profilu wersję LabVIEW, z której korzystasz. Pitol

Re: Jak odczytać cześć pliku od końca

: 27 wrz 2011 16:48
autor: Pitol
Pewnie da się prościej, ale chciałem zrobić coś fajnego:
file.PNG
Idea jest prosta:
Czytamy od końca po jednym bajcie i sprawdzamy czy jest to znak Line Feed. Jeśli tak, to zwiększamy licznik nowych linii i przesuwamy licznik pozycji kolejnego znaku o 2 (a nie o jeden, jak to jest normalnie). Dlaczego o 2? Bo znak końca linii składa się z dwóch bajtów (Line Feed i Carriage Return).

Nie mam pojęcia, czy to rozwiązanie sprawdzi się w Twoim przypadku, ale chciałem sobie udowodnić, że się da to zrobić szybko :) i się udało...

Jak odczytać cześć pliku od końca

: 27 wrz 2011 18:42
autor: bartus
Brawo Pitol, jeszcze tylko odwrócić tablicę i będzie zgodnie z kolejnością zapisu :)

Re: Jak odczytać cześć pliku od końca

: 27 wrz 2011 20:59
autor: Pitol
Tam jest string a nie tablica. Wyjściowy string jest już odwrócony (tylko indykator znajduje się wewnątrz pętli). Wszystko jest wg wymagań Pana Kapitana ;)

EDIT: W sumie nie trzeba odwracać stringa na końcu, tylko w bloczku Concatenate zamienić ze sobą wejścia (tak, aby nowy znak dodawał się na początku).

Re: Jak odczytać cześć pliku od końca

: 28 wrz 2011 14:32
autor: kapitan7
No i działa piknie :)

Proste jasne i oczywiste. Bardzo dziękuje za pomoc.

Ma się rozumieć że LV nie daje takiego bloczku defaultowo? - szkoda bo wydaje mi się bardzo przydatny.

Jak odczytać cześć pliku od końca

: 28 wrz 2011 15:06
autor: Pitol
Najwyraźniej nikt o tym nie pomyślał wcześniej ;)

Tak dla wyjaśnienia: jeśli wczytujesz duży plik (~30MB) to wywal z tego przykładu odczyt całego pliku, bo to on najwięcej zżera czasu. Sam "algorytm" działa w miarę szybko. Testowałem to na 25MB pliku logu z jakiegoś programu.

Zauważyłem dodatkowo, że program nie jest odporny na kodowanie pliku. Plik txt musi być zapisany w ANSI. Jeśli jest w Unicode, to tam każdy znak zajmuje 2 bajty więc trzeba by przerobić. Jeśli interesowała by Cię taka wersja to daj znać. Coś się wymyśli.

Re: Jak odczytać cześć pliku od końca

: 28 wrz 2011 21:33
autor: Pitol
Nie było to takie trudne. W załączniku wersja niezależna od kodowania pliku.
ReadLinesBD.PNG
ReadLinesFP.PNG

Re: Jak odczytać cześć pliku od końca

: 29 wrz 2011 13:36
autor: kapitan7
Widzę że jesteś jak Tefal - myślisz o wszystkim :)

Na razie nie potrzebuję innego kodowania to co jest w zupełności mi wystarczy.

Teraz staję przed zadaniem zrobienia wykresu 3D z pliku 700MB :) - na razie poszukam na forum jak nic nie znajdę to będę znowu błagał o pomoc :)

Pozdrawiam,