Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]przenoszenie PATH z jednej części linii kodu do innej
Forum PHP.pl > Forum > Przedszkole
qpanas
Mam problem, z którym borykam się od kilku dni. Mam kilka plików z dziesiątkami tysięcy linii do przerobienia. To pytania i odpowiedzi dla Mnemosyne - kurs angielskiego, który sobie wyeksportowałem z oryginalnego Supermemo (legalnej kopii - po prostu skończyłem z Windowsem a pod Linuksem nie dało się używać z oczywistych względów). Format danych w każdej linii jest identyczny i wygląda tak

Cytat
jakiś_tekstTABjakiś_inny_tekst<br><sound src="PATH">


Mnemosyne odczytuje pojedynczą linię i wyświetla ją sformatowaną na podstawie występowania tabulatora. Część, która jest przed tabem jest wyświetlana w jednym oknie, a część po tabie w drugim pod naciśnięciu klawisza "pokaż odpowiedź" i dodatkowo odtwarza się plik dźwiękowy, do którego ścieżka jest po znaczniku <br>
Niestety okazuje się, że muszę przenieść wszystkie ścieżki na lewą stronę tabulatora. Niby prosta operacja w edytorze tekstu CTR-A, CTR-X, CTR-V. Tylko przy ponad dwustu tysiącach linii robiłbym to z rok, albo i dłużej. Chciałem wyprodukować jakiś skrypt albo znaleźć komendę pod konsolą linuksową, która by to z automatu zrobiła. Ale poległem. Próby z sed nie przyniosły skutku (potrafię tylko kilka bardzo prostych rzeczy z jego pomocą zrobić) a programistą nie jestem. Czy wie ktoś jak się do tego zabrać? Będę wdzięczny za każdą pomoc.
kipero
To znaczy jak ma to wyglądać?
Kod
jakiś_tekst<br><sound src="PATH">TABjakiś_inny_tekst

Z wyrażeniami regularnymi się można pobawić, tylko nie wiem czy jest sens używać do tego PHP - może wystarczy tylko edytor tekstu, który takie rzeczy obsługuje.
Ja spróbowałbym tak:
  1. <?php
  2. $txt = 'jakiś_tekst    jakiś_inny_tekst<br><sound src="PATH">';
  3. $txt = preg_replace('#([^\t]+)\t([^<]+)<br>(.*)#i', "$1<br>$3\t$2", $txt);
  4. echo $txt;
  5. ?>

To tylko przykład, ale można go użyć do tego co chcesz wykonać. Nie mniej jednak może się lekko wykrzaczyć przy 200k rekordów.
qpanas
Cytat(kipero @ 15.07.2009, 21:14:59 ) *
To znaczy jak ma to wyglądać?
jakiś_tekst<br><sound src="PATH">TABjakiś_inny_tekst


Dokładnie tak ma to wyglądać. Ja początkowo myślałem, żeby wstawić jakiś znacznik pomiędzy pierwszym tekstem i tabulatorem np. %&$ czy inny zestaw znaków, które nie występują w oryginalnym tekście, a potem kazać skryptowi wyszukiwać ścieżki tzn. cały fragment <br><sound src="PATH"> i wycinać a potem wklejać w miejsce tego znacznika. Skrypt musi to robić linia po linii bo jak przeniesie jakąś ścieżkę do innej linii to za diabła nie połapię się w tym i cały kurs angielskiego będzie do kosza. A ja muszę się uczyć języka.
erix
Dodaj tag do tematu.
kipero
No to możesz zastosować ten skrypt, który napisałem, ewentualnie otwórz ten plik w jakimś edytorze z obsługą wyrażeń regularnych. Ja do testów użyłem Notepad++ i dla tego edytora napiszę co i jak:
- otwierasz plik
- menu "Szukaj"|"Zamień"(CTRL + H)
- zaznaczasz tryb szukania na "Wyrażenia regularne"
- w polu "Szukany tekst" wpisujesz: ([^\t]+)\t([^<]+)<br>(.*)
- w polu "Zamień na": \1<br>\3\t\2
Na trochę może to zamulić kompa, ale działa(ja testowałem dla 14k rekordów i trwało dobrą minutę).

Poza tym zrób sobie kopię pliku tej bazy, bo:
Cytat
jak przeniesie jakąś ścieżkę do innej linii to za diabła nie połapię się w tym i cały kurs angielskiego będzie do kosza
qpanas
Dzięki - postaram się nie zwalić tego ;-)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.