Skocz do zawartości
"Idzie nowe..." - o zmianach i nie tylko ×
Przeniesienie zakupów z IPS Marketplace / Moving bought items from IPS Marketplace ×

Dzielenie dużych plików txt i sql na mniejsze


matma4u

Rekomendowane odpowiedzi

Witam!

Poszukuję jakiegoś inteligentnego rozwiązania, jak dzielić duże pliki txt i sql na mniejsze. Używam Ubuntu więc proszę o rozwiązania pod ten system. Często zdarza się tak, że potrzebuję coś z bazy usunąć lub zmienić za pomocą wyrażeń regularnych na jakiś inny tekst, ale nie sposób otworzyć w edytorze tekstu np. plików logów serwera, który ma 400MB, lub bazę o rozmiarze 75MB. Nawet jak już uda się otworzyć taki plik (po kilkunastu minutach czekania) to praca na nim należy do bardzo mało komfortowych.

Na oficjalnym forum Ubuntu pisałem, o tym problemie, ale uzyskałem połowiczne rozwiązanie, za pomocą polecenia split

O ile w przypadku plików tekstowych split sprawdza się znakomicie, to już w przypadku plików sql nie jest tak różowo, bo potrzeba by dzieliło je inteligentnie. Załóżmy, że mój plik ma zawartość:

     INSERT INTO `nazwa_tabeli` (`nazwa_kolumny1`,`nazwa_kolumny2`)
     VALUES ('wartość','wartość2');
     INSERT INTO `nazwa_tabeli` (`nazwa_kolumny1`,`nazwa_kolumny2`)
     VALUES ('wartość','wartość2');
     INSERT INTO `nazwa_tabeli` (`nazwa_kolumny1`,`nazwa_kolumny2`)
     VALUES ('wartość','wartość2');

Używając polecenia split (z odpowiednimi parametrami co do wielkości i liczby linii) powstaną np dwa pliki o zawartości:

________________________Pierwszy plik___________
    INSERT INTO `nazwa_tabeli` (`nazwa_kolumny1`,`nazwa_kolumny2`)
    VALUES ('wartość','wartość2');
    INSERT INTO `nazwa_tabeli` (`nazwa_kolumny1`,`nazwa_kolumny2`)

    _________________________Drugi plik_______________-
    VALUES ('wartość','wartość2');
    INSERT INTO `nazwa_tabeli` (`nazwa_kolumny1`,`nazwa_kolumny2`)
    VALUES ('wartość','wartość2');

W przypadku takiego podziału jest problem, bo gdy za pomocą phpadmina będę próbował wgrać zawartość takich plików do bazy to wyświetli błąd składni, bo poprawnie plik powinno podzielić tak:

________________________Pierwszy plik___________
    INSERT INTO `nazwa_tabeli` (`nazwa_kolumny1`,`nazwa_kolumny2`)
    VALUES ('wartość','wartość2');
    INSERT INTO `nazwa_tabeli` (`nazwa_kolumny1`,`nazwa_kolumny2`)
    VALUES ('wartość','wartość2');

    _________________________Drugi plik_______________-
    INSERT INTO `nazwa_tabeli` (`nazwa_kolumny1`,`nazwa_kolumny2`)
    VALUES ('wartość','wartość2');

W jaki sposób osiągnąć taki sposób podziału zawartości pliku? Prosiłbym o podanie dokładnej składni polecenia dla tego przykładu

Doszukałem się na necie jeszcze kilku informacji na temat csplit - w którym można używać wyrażeń regularnych, ale mimo przeczytania manuala nie potrafię wprowadzić tego w życie. Oczywiście niekoniecznie musi to być rozwiązanie oparte o split i csplit

46279b204b.png

Rozwiążemy dla Ciebie każde zadanie z matematyki: http://matma4u.pl

Odnośnik do komentarza
Udostępnij na innych stronach

  • Manager

Szkoda, że pod jakiegoś *nixa szukasz, bo pod Windows jest znakomity mały programik o nazwie SQLDumpSplitter.

intermedia - profesjonalne rozwiązania Invision Power Board

---

Chcesz uzyskać szybko i sprawnie pomoc? Uzupełnij wersję i adres w profilu.

Odnośnik do komentarza
Udostępnij na innych stronach

Przerzuciłem się na systemy spod znaku pingwina bo zapewniają dużo lepsze rozwiązanie, bardziej stabilne. Spróbuj otworzyć plik tekstowy powyżej 350MB pod Windowsem - zawieszenie programu gwarantowane, a pod linuksem nawet jak parę minut "pomyśli" to i tak go otworzy. A teraz testuje GVim i muszę powiedzieć, że istne szaleństwo, bo pliki 350MB otwiera w niecałe 3 sekundy !!!!

A za pomocą poleceń z terminala w ciągu kilku sekund z każdego pliku wyciągasz dane które szukasz. Np masz logi serwera (w plik.log) i chcesz zobaczyć jak Googlebot odwiedzał Twoją stronę:

for i in Googlebot; do grep "$i" plik.log > $i.log; done

W niecałą sekundę zostaje utworzony plik o nazwie Googlebot.log a w nim wszystkie wpisy związane z jego odwiedzinami.

Oczywiście kryteria przeszukiwania możesz określać dowolnie.

46279b204b.png

Rozwiążemy dla Ciebie każde zadanie z matematyki: http://matma4u.pl

Odnośnik do komentarza
Udostępnij na innych stronach

No i dobrze rozumujesz. Co do edytowania. A raczej podmieniania wartosci regularnych. Polecam Ci uzyc polecenie w gVim

s/wartosc_do_zamiany/wartosc_nowa

s=sed

Ja osobiscie wole zamiast gVim czyli graficznego uzywac vim ktory uzywa sie w konsoli.

A do wyciagania to mozesz uzywac jeszcze:

cat plik | grep "wyrazenie" > plik.txt

Jezeli pamiec mnie nie myli ladnie rowniez zadziala Ci. Mozesz sobie rowniez gotowy skrypt w bashu skrobnac :)

Edytowane przez mlodszy
Odnośnik do komentarza
Udostępnij na innych stronach

No i dobrze rozumujesz. Co do edytowania. A raczej podmieniania wartosci regularnych. Polecam Ci uzyc polecenie w gVim

s/wartosc_do_zamiany/wartosc_nowa

s=sed

Ja osobiscie wole zamiast gVim czyli graficznego uzywac vim ktory uzywa sie w konsoli.

Do podmiany jakiegoś wyrażenia na inne (np w bazie) korzystam z polecenia:

sed -e 's/wyrażenie1/wyrażenie2/g' plik.sql > kopia_pliku.sql

Oryginalny plik jest nienaruszany, a tworzony jest nowy ze zmienioną zawartością.

A do wyciagania to mozesz uzywac jeszcze:

cat plik | grep "wyrazenie" > plik.txt

To rozwiązanie zaproponowane przez Ciebie jest jeszcze lepsze, bo mniej pisania w konsoli, tylko jak zrobić by polecenie nie było "Case sensitive".

Bo dla wyrażenie będę miał inne wyniki wyszukiwania niż dla Wyrażenie

46279b204b.png

Rozwiążemy dla Ciebie każde zadanie z matematyki: http://matma4u.pl

Odnośnik do komentarza
Udostępnij na innych stronach

Do podmiany jakiegoś wyrażenia na inne (np w bazie) korzystam z polecenia:

sed -e 's/wyrażenie1/wyrażenie2/g' plik.sql > kopia_pliku.sql

Oryginalny plik jest nienaruszany, a tworzony jest nowy ze zmienioną zawartością.

To rozwiązanie zaproponowane przez Ciebie jest jeszcze lepsze, bo mniej pisania w konsoli, tylko jak zrobić by polecenie nie było "Case sensitive".

Bo dla wyrażenie będę miał inne wyniki wyszukiwania niż dla Wyrażenie

O widzisz. Zapomnialem o "g" jako global :)

Co do tego drugiego. Tutaj dochodzi nam kwestia regex. Wiecej o tym:

http://pl.wikipedia.org/wiki/Wyrażenie_regularne

Polecam poczytac to:

http://www.regular-expressions.info/tutorial.html

Edytowane przez mlodszy
Odnośnik do komentarza
Udostępnij na innych stronach

  • 1 rok później...

@matma4u ostatnio siedziałem nad sporymi konwersjami baz danych. Małe spostrzeżenia.

Używaj zawsze przełącznika "-e", zwłaszcza w skryptach.

Przy sed zamiast "/" korzystaj z "|" lepiej to działa. Mniej trzeba robić tzw odbitek dla znaków specjalnych.

I ostatnia rada - Przy zmianach w bazie danych danych do przeróbki nie bierz z phpmyadmin, a bezpośrednio z zrzuconego pliku SQL.

Może Ty masz jakieś ciekawe spostrzeżenia?

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę.