Dzielenie dużego pliku na mniejsze

0

Witam społeczność,
Mam dość spory plik (nieco ponad 500MB). Jest to wynik dumpa sql. Postanowiłem napisać sobie prosty programik, żeby go podzielić. Pytanie do Was. Jak to najlepiej zrobić? Jakich funkcji użyć, żeby to było dość sprawnie.

0

W jaki sposób chcesz ten plik podzielić?
Po bajtach, linijkach, zapytaniach?

0

Ale chcesz go podzielić fizycznie czy tak żeby po podzieleniu i odpaleniu każdej części można było odtworzyć część danych?

0

Przed każdą częścią jest coś na kształt tytułu:

--
-- Jakiś tam tekst
--

I po tym chcę dzielić. Gdyby plik był mniejszy, to beż problemu funkcjami strpos, czy pos itp. Ale boję się, że jak załaduję cały ten plik do zmiennej, to wszystko się wywiesi i tyle. Dlatego pytam.

1

Nie musisz wczytywać całego pliku naraz - możesz (i - jak sam zauważyłeś - powinieneś) działać na blokach po 4 kilobajty na przykład.

0

Ok. A jak początek fragmentu znajdzie się w jednym bloku, a koniec w drugim?

0

No to wtedy łączysz fragmenty razem ;-)
Musisz tutaj ruszyć głową, aby miało to sens, a nie klepać na pałę.

1
Buster napisał(a):

Ok. A jak początek fragmentu znajdzie się w jednym bloku, a koniec w drugim?

W podobny sposób zrealizowane jest ładowanie tekstu z pliku do listy typu TStringList w metodzie LoadFromFile. Ze strumienia ładowane są bloki o stałym rozmiarze i dzielone na linie. Z racji różnych terminatorów linii, metoda ładująca potrafi zapobiec błędowi, jeśli sekwencja CRLF będzie podzielona na dwa bloki – CR na końcu jednego bloku i LF na początku kolejnego.

Jeśli masz dostęp do kodu źródłowego to tam szukaj podpowiedzi, a jeśli nie to zawsze możesz pobrać Lazarusa i sprawdzić w jego źródłach. Tam podział wczytywanych bloków jest częsty, bo linie zwykle są krótkie, ale to taki algorytm, jakiego potrzebujesz.

Ładowanie danych w blokach jest co prawda trudniejsze, ale za to efektywne i oszczędne pamięciowo. Jeśli nie dasz sobie z tym rady to zawsze możesz czytać dane ze strumienia bajt po bajcie i w ten sposób szukać wymaganej frazy. Będzie to powolne (choć bez testów trudno powiedzieć jak bardzo), ale przynajmniej łatwiejsze w implementacji.


Edit: choć tak szczerze mówiąc, jeśli potrzebujesz podzielić tylko jeden plik, to równie dobrze możesz skorzystać z jakiegoś gotowego narzędzia. Jakiś lepszy hex-edytor na pewno ma funkcję wyszukiwania danych i wydzielania fragmentów do osobnych plików.

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