W jaki sposób posługiwać się plikami tekstowymi?

0

Być może trochę niefortunnie sformułowałem nazwę tematu, bo nie oddaje on tego o co chodzi, ale ciężko mi wymyślić jakiś inny sensowny.
Przechodząc do sedna, kwestie są dwie. Mam bardzo duże pliki i jest ich dosyć dużo. W jaki sposób lepiej jest z nich "korzystać"? Czy wczytać je raz i później ewentualnie przy każdej zmianie wczytywać ponownie czy za każdym razem w potrzebnym momencie otwierać odpowiedni plik? W pierwszym przypadku wydaje mi się, że program niepotrzebnie by wykorzystywał pamięć mając zawartość wszystkich plików w zmiennych. Natomiast w drugim... zapewne odwołanie do zmiennej jest szybsze niż otworzenie i przeszukanie długiego pliku tekstowego.

W tym momencie mam w programie dwa języki, polski i angielski. Wszystkie teksty są w w dwóch plikach tekstowych. Napisałem funkcję, w której jako parametr podaje się numer linijki. Funkcja otwiera odpowiedni plik w zależności od wybranego jeżyka i jako wynik podaje zawartość linijki podanej jako parametr. Wymaga to za każdym razem otworzenia pliku. Zastanawiam się czy nie lepiej będzie wczytać przy uruchamianiu programu obu plików do dwóch tablic?

Druga sprawa. W jaki sposób przechowywać dane? Niestety na bazach danych się zupełnie nie znam i co pewnie jest błędem wszystko przechowuje w plikach tekstowych. Mam kilka różnych struktur w kilku różnych plikach. Wygląda to w skrócie tak:

 
[osoba]
imie = ...
nazwisko = ...
data urodzenia = ...
id = ...

[grupa]
nazwa = ...
ilosc osob = ...
id n osoby = ...
id grupy = ...

[podusmowanie dnia]
data = ...
bilans laczny = ...
bilans n grupy = ...

Chciałbym aby to wszystko było zapakowane w jeden plik. Mogę to zapisać w zwykły plik tekstowy. Problemów z odróżnieniem nie będę miał. Tylko jeśli zrobi się np 50 grup, a w każdej po 30 osób to już daje 1500 osób. Zakładając że na każdą jest poświęcone 10 linijek do już daje ich 15000. A do tego mają być podsumowania każdego dnia, wiec praktycznie z każdym kolejny dniem ilość tych linijek wzrasta arytmetycznie. A więc problem poniekąd jest jak w pierwszej części. Odczytywanie takiego pliku będzie pewnie zbyt długie, aczkolwiek nie testowałem tego.

3

Pliki tekstowe zostaw w spokoju, do takich rzeczy służą właśnie bazy danych. Dla Ciebie wystarczy sqlite (Nie potrzeba nic instalować). Do obsługi bazy z poziomu lazarusa najprostsze będą komponenty zeos. Do tego, przy bazie będziesz mógł w przyszłości bardzo prosto podpiąć raportowanie (lazreports).
Poczytaj sobie o bazach danych, na necie jest dużo opisów i przykładów.

Pozdrawiam
Paweł Dmitruk

0

err1.png

0

Zrób to w pliku typu XML albo najlepiej typowanym. Więcej informacji na ten temat wygooglujesz.

0

zainstalowalem sqlite i zeos zeby miec bazy danych w lazarusie ale nie do konca bo pojawil sie blad ktory podalem posty wyzej

ktos mial podobny problem

czy ma sens szukanie tych plikow w necie i wrzucanie w odpowiednie katalogi ?

0
dani17 napisał(a)

Mam bardzo duże pliki i jest ich dosyć dużo. W jaki sposób lepiej jest z nich "korzystać"? Czy wczytać je raz i później ewentualnie przy każdej zmianie wczytywać ponownie czy za każdym razem w potrzebnym momencie otwierać odpowiedni plik?

Jeśli pliki są bardzo duże, to nie ładuj ich w całości do pamięci; A jeśli jest ich bardzo dużo, to tym bardziej - zawalisz całą pamięć i będzie dopiero problem;

W tym momencie mam w programie dwa języki, polski i angielski. Wszystkie teksty są w w dwóch plikach tekstowych.

To jest dość częste podejście, stosowane np. w grach, jednak nie jest najlepsze; Owszem, może i wygodne jest, bo wystarczy znać indeks linii, z której potrzeba odczytać łańcuch, jednak najpierw trzeba przemielić wszystkie wcześniejsze linie, co jest czasochłonne;

W jaki sposób przechowywać dane? Niestety na bazach danych się zupełnie nie znam i co pewnie jest błędem wszystko przechowuje w plikach tekstowych.

Jeśli nie znasz systemów bazodanowych, to lepiej zostaw je w spokoju - narobisz sobie tylko bałaganu; Żeby z bazy danych można było spokojnie skorzystać, najpierw trzeba się ich obsługi nauczyć, a tego w jeden dzień nie zrobisz; Ewentualnie póki co zostaw ten program i najpierw poćwicz używanie baz danych;


Jeśli nie ciągnie Cię do baz danych czy nie masz czasu na uczenie się ich obsługi, to polecę Ci pliki amorficzne; Typowanych niestety nie możesz użyć, dlatego że struktury danych poszczególnych sekcji są różne;

W pierwszej kolejności zapisz sobie ilość "paczek" w pliku, następnie dane wszystkich paczek, a na końcu podsumowanie; Żeby cokolwiek dało się dokładnie zasugerować - musiałbym znać dokładną zawartość wszystkich plików, a dokładniej jakie dane mają przechowywać i jakie dane znajdują się w paczkach;

Pliki amorficzne dadzą Ci tę przewagę, że w nich znajdą się tylko właściwe dane, bez ich oznaczeń (np. ilosc osob), a także umożliwią Ci szybki dostęp do danego fragmentu pliku, bez konieczności mielenia jego zawartości od początku (przenosisz się do określonego bajtu za pomocą właściwości Position); Do tego odczyt i zapis danych jest bardzo prosty - strumień TFileStream posiada metody Read i Write, bądź ReadBuffer/WriteBuffer, które są proste w użyciu.

0

@furious programming Ale i tak jak chcesz coś wyszukać lub podsumować wartość obrotu (?) musisz zapuścić pętlę z warunkiem po wszystkich rekordach konkretnej "tabeli", sam wszystko okodować, natomiast w przypadku db to sam silnik wszystkim się zajmuje, wykonujesz tylko proste zapytanie i voila. Dodatkowo wyświetlenie danych jest też praktycznie bezobsługowe, pod aktywnego dataseta podpinasz grida i widzisz listę pracowników/grup/obrotów.

Obsługa baz nie jest wcale taka skomplikowana, do programu, jaki chce zrobić autor wystarczy trochę poczytać o tworzeniu tabel i indeksów, select'ach z join'em, insert, update i delete.

@aeryn sun - błąd nie ma związku z instalacją komponentów zeos, ale brakiem pliku componenttreeview, wykorzystywanym w aktualnie otwartym projekcie

Pozdrawiam
Paweł Dmitruk

0

Ale i tak jak chcesz coś wyszukać lub podsumować wartość obrotu (?) musisz zapuścić pętlę z warunkiem po wszystkich rekordach konkretnej "tabeli", sam wszystko okodować, natomiast w przypadku db to sam silnik wszystkim się zajmuje, wykonujesz tylko proste zapytanie i voila.

Silnik bazodanowy przecież robi dokładnie to samo, tyle że jedną instrukcją; Znając strukturę pliku, wystarczy w prostej pętli odczytywać liczbę i inkrementować Position i rozmiar struktury, więc to tylko nagłówek pętli i dwie instrukcje;

Dodatkowo wyświetlenie danych jest też praktycznie bezobsługowe, pod aktywnego dataseta podpinasz grida i widzisz listę pracowników/grup/obrotów.

Racja, racja - nie zaprzeczam;

Obsługa baz nie jest wcale taka skomplikowana, do programu, jaki chce zrobić autor wystarczy trochę poczytać o tworzeniu tabel i indeksów, select'ach z join'em, insert, update i delete.

Ja rozumiem, że nie jest to takie trudne, jednak pytacz ma już dużo podstawowych problemów; Do tego dojdzie nauka obsługi baz danych, tworzenia poprawnych zapytań itd., czego tak szybko nie zrozumie; Poza tym założę się, że pytań na forum zrobi się więcej, bo nie wszsytko pewnie zrozumie;


Ja nie twierdzę, że w tym przypadku baza danych jest zła (wręcz przeciwnie), jednak jeśli pytacz nie umie się nimi posługiwać, to całkiem przyjemnie da się to zrobić na plikach binarnych, do których obsługi praktycznie nie będzie się musiał nic uczyć; Tyle tylko, że będzie musiał więcej kodu naklepać, niż wyklikać w edytorze.

0
furious programming napisał(a):

Silnik bazodanowy przecież robi dokładnie to samo, tyle że jedną instrukcją; Znając strukturę pliku, wystarczy w prostej pętli odczytywać liczbę i inkrementować Position i rozmiar struktury, więc to tylko nagłówek pętli i dwie instrukcje;

Dokładnie, silnik to robi :-)

Ja rozumiem, że nie jest to takie trudne, jednak pytacz ma już dużo podstawowych problemów; Do tego dojdzie nauka obsługi baz danych, tworzenia poprawnych zapytań itd., czego tak szybko nie zrozumie; Poza tym założę się, że pytań na forum zrobi się więcej, bo nie wszsytko pewnie zrozumie;


Ja nie twierdzę, że w tym przypadku baza danych jest zła (wręcz przeciwnie), jednak jeśli pytacz nie umie się nimi posługiwać, to całkiem przyjemnie da się to zrobić na plikach binarnych, do których obsługi praktycznie nie będzie się musiał nic uczyć; Tyle tylko, że będzie musiał więcej kodu naklepać, niż wyklikać w edytorze.

Przy obsłudze plików też pojawi się więcej problemów (więcej kodu), też będzie więcej pytań itp. :-)

0

dzieje sie to jak instaluje zeos

lazarusdb.png

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