Potrzebuje prostego utila kasującego wybrane linie separowane CRLF. Parametrem moglby byc np. znak rozpoczynający wiersz. Problem tylko, że plik ma juz w tej chwili 150 MB a linie nawet po 100 KB.
Do tej pory radzilem sobie dosowymi find i type, ale zadanie caly czas wymaga uwagi i kontroli bo type czyta do 4KB w linii tylko. Może ktoś skrobnąlby mi cos (na potrzeby Wikipedii of coz). Kiedys ludzie takie cos pisali w Pascalu przy sniadaniu. :-)))
Beno
Gemma napisał(a):
Potrzebuje prostego utila kasującego wybrane linie separowane CRLF. Parametrem moglby byc np. znak rozpoczynający wiersz. Problem tylko, że plik ma juz w tej chwili 150 MB a linie nawet po 100 KB.
znaczy np. wiersz sie zaczyna od '@' (rzadki znak jak na poczatek wiersza, zwlaszcza w jezyku polskim =}}}, a w dodatku rzuca sie w oczy)?
Do tej pory radzilem sobie dosowymi find i type, ale zadanie caly czas wymaga uwagi i kontroli bo type czyta do 4KB w linii tylko. Może ktoś skrobnąlby mi cos (na potrzeby Wikipedii of coz). Kiedys ludzie takie cos pisali w Pascalu przy sniadaniu. :-)))
he, wspolczesni programisci tez juz dawno sobie tym glowy nie psowaja i korzystaja z gotowcow, a jedzac sniadanie pisza np. MediaWiki. =} nie potrzeba nawet byc programista, da sie standardowymi linuksowymi narzedziami, np. tak (moze byc jakas roznica z CRLF zamiast LF, ale nie sadze, w dodatku latwo to poprawic):
grep -v ^@ plik_wejsciowy.txt > plik_wyjsciowy.txt
-v oznacza pomijanie wierszy zawierajacym dany wzorzec, a daszek (^) oznacza ze liczymy tylko malpy na poczatku wiersza -- dzieki temu wiersz zawierajacy ciag np. 'sloneczna@trojka.pl' przetrwa eksterminacje. na wszelki wypadek robie takie operacje zawsze do nowego pliku, choc mozna nawet kazac mu ciachac bezposrednio na pliku wejsciowym (nie polecam).
uspokajam -- pod DOS/Widows tez te narzedzia sa. MSZ najlepiej od razu zassac sobie [[Cygwin]]a i miec emulowanie spojne srodowisko [[POSIX]] zamiast pojedyncze [[port (oprogramowanie)|porty]] zbierac: poza grepem polecam poczytac instrukcje obslugi do sort, uniq, sed, tr, cat i echo, a swiat obrobki danych tekstowych stoi przed toba otworem. ;-} do bardziej zaawansowanych celow polecam awka i jeszcze dalej -- perla.
ich zaleta jest standardowosc, duze mozliwosci i dokladna dokumentacja (man polecenie, info polecenie, pinfo polecenie) duza predkosc (nawet w trybie emulacji) i mozliwosc sklejania w wieksze ciagi polecen. sam sie przekonalem do nich jak WordBasic mielil mi kilka tysiecy adresow pol godziny albo lepiej -- awk zalatwia to samo w trybie tekstowym w czasie rzedu sekund, tak ze najdluzej trwa konwersja do formatu tekstowego z pliterkami itp., oraz czasem wymyslanie co dokladnie chce osiagnac (uniq potrafi np. wybierac tylko wiersze powtarzajace sie albo tylko nie powtarzajace sie).
tak z ciekawosci -- daj znac jaki tobie benchmark wyjdzie. =}
Gemma wrote:
Potrzebuje prostego utila kasującego wybrane linie separowane CRLF. Parametrem moglby byc np. znak rozpoczynający wiersz. Problem tylko, że plik ma juz w tej chwili 150 MB a linie nawet po 100 KB.
Do tej pory radzilem sobie dosowymi find i type, ale zadanie caly czas wymaga uwagi i kontroli bo type czyta do 4KB w linii tylko. Może ktoś skrobnąlby mi cos (na potrzeby Wikipedii of coz). Kiedys ludzie takie cos pisali w Pascalu przy sniadaniu. :-)))
Nie przy śniadaniu, tylko przy kolacji. Nie w Pascalu (w tym to piszą tyko Ci co nie umieją programować) tylko w Perlu. Ale raczej zadziała.
open( FILE, "$ARGV[1]" ) or die("can't open file $ARGV[1]: $!"); while( <FILE>) {print $_ if( /^\s*$ARGV[0]/);}
pierwszy argument to znaki po jakich rozpoznawać linie do wyrzucenia (początkowe spacje i tabulatory ignorowane), drugi argument to nazwa pliku wejściowego. Wynik działana wyrzuca na STDIO (ekran). Jak chesz do pliku to użyj przekierowania ">". Przykład (nazwa skryptu to perl.pl):
perl parse.pl ala sciezka/do/pliku >plik_wynikowy
zapisze do pliku "plik_wynikowy" wszystkie linie nie rozpoczynające się od "ala".
-- mogor
Michał Góralczyk wrote:
open( FILE, "$ARGV[1]" ) or die("can't open file $ARGV[1]: $!"); while( <FILE>) {print $_ if( /^\s*$ARGV[0]/);}
no i mały bład powinno być:
open( FILE, "$ARGV[1]" ) or die("can't open file $ARGV[1]: $!"); while( <FILE>) {print $_ unless( /^\s*$ARGV[0]/);}
ale w rzeczy samej grep do tego najlepszy.
-- mogor
Mieliście dzisiaj takie problemy, że system odmawiał zapisywania zmian w artykułach, albo zamiast zapisać artykuł zwracał puste pole edycyjne? Miałem tego rodzaju problemy w godzinach 18.30-20.00 - teraz już jest chyba dobrze... ale to raczej niepokojący objaw, wskazujący że coś nie tak jest z obsługą bazy danych...
On Sun, 26 Dec 2004 20:21:19 +0100 "Gemma" studio@gemma.edu.pl wrote:
Potrzebuje prostego utila kasującego wybrane linie separowane CRLF. Parametrem moglby byc np. znak rozpoczynający wiersz. Problem tylko, że plik ma juz w tej chwili 150 MB a linie nawet po 100 KB.
Do tej pory radzilem sobie dosowymi find i type, ale zadanie caly czas wymaga uwagi i kontroli bo type czyta do 4KB w linii tylko. Może ktoś skrobnąlby mi cos (na potrzeby Wikipedii of coz). Kiedys ludzie takie cos pisali w Pascalu przy sniadaniu. :-)))
Pod Wingroze nie piszę już od lat, ale mogę przymierzyć się do tego w perlu, tylko proszę napisz dokładnej o co Ci chodzi. Może jakiś plik przykładowy, mogę zobaczyć czy perl to dźwignie - do tej pory nie bawiłem się tak długimi liniami, a jak nie to coś innego wymyślimy.
Ścibór