Jak odczytać cześć pliku od końca

Jeśli masz coś do powiedzenia w sprawie LabVIEW napisz. Tutaj są tematy, których nie można uściślić do innych działów.
kapitan7
Posty: 114
Rejestracja: 31 paź 2005 00:00
Wersja środowiska: LabVIEW 8.2
Lokalizacja: Cz-wa / Wa-wa

Jak odczytać cześć pliku od końca

Post 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
kapitan7
Awatar użytkownika
Pitol
Moderator
Posty: 987
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków

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

Post 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...
Załączniki
file_8.2.vi
LabVIEW 8.2
(13.62 KiB) Pobrany 265 razy
ObrazekObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj
Awatar użytkownika
bartus
Posty: 141
Rejestracja: 07 maja 2007 00:00
Wersja środowiska: LabVIEW 2009
Lokalizacja: Wrocław/Żory

Jak odczytać cześć pliku od końca

Post autor: bartus »

Brawo Pitol, jeszcze tylko odwrócić tablicę i będzie zgodnie z kolejnością zapisu :)
Jest pare rzeczy dla których warto zyc - TO,UE i nie zmienia sie nic :)
Awatar użytkownika
Pitol
Moderator
Posty: 987
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków

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

Post 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).
ObrazekObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj
kapitan7
Posty: 114
Rejestracja: 31 paź 2005 00:00
Wersja środowiska: LabVIEW 8.2
Lokalizacja: Cz-wa / Wa-wa

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

Post 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.
kapitan7
Awatar użytkownika
Pitol
Moderator
Posty: 987
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków

Jak odczytać cześć pliku od końca

Post 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.
ObrazekObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj
Awatar użytkownika
Pitol
Moderator
Posty: 987
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków

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

Post autor: Pitol »

Nie było to takie trudne. W załączniku wersja niezależna od kodowania pliku.
ReadLinesBD.PNG
ReadLinesFP.PNG
Załączniki
ReadingLinesFromEndOfFile_8.2.vi
LV 8.2
(51.29 KiB) Pobrany 241 razy
ReadingLinesFromEndOfFile.vi
LV 10.0
(41.63 KiB) Pobrany 254 razy
ObrazekObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj
kapitan7
Posty: 114
Rejestracja: 31 paź 2005 00:00
Wersja środowiska: LabVIEW 8.2
Lokalizacja: Cz-wa / Wa-wa

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

Post 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,
kapitan7
ODPOWIEDZ