Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Rotiranje fajla

[es] :: Skript jezici :: Rotiranje fajla

Strane: 1 2

[ Pregleda: 5611 | Odgovora: 31 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.racasse.se

Sajt: dejan.lekic.org


+2 Profil

icon Rotiranje fajla21.05.2003. u 19:30 - pre 254 meseci
Elem problem je sledeci i veoma jednostavan - rotirati fajl tako da na izlazu dobijete prvo zadnju liniju istog, potom predzadnju i tako dalje...

Dakle ako imate u fajlu:
Code:

12
a2
4b
c2

Onda skript treba da da na izlazu
Code:

c2
4b
a2
12


P.S. Fajlovi su MNOGO veliki (skoro gigabajt)...
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.racasse.se

Sajt: dejan.lekic.org


+2 Profil

icon Re: Rotiranje fajla21.05.2003. u 20:35 - pre 254 meseci
Ma moze bilo koji shell skript jezik (da se pokrene iz shell-a), s tim da procesiranje fajla od skoro GB ne traje vise od 2h :) ...
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

CONFIQ
♫♪♥♪♫

Član broj: 4218
Poruke: 1994
*.red.bezeqint.net

ICQ: 82327428


+10 Profil

icon Re: Rotiranje fajla21.05.2003. u 20:45 - pre 254 meseci
Ovaj, izbrisao sam poruku koja je bila pre tvoje (slučajno).
Pitao sam da li može PHP-om. pokušavao sam 10 minuta i odustajem.
Nisam znao da ako koristim fwind(); file pointer se vraća na početak i briše sve na šta sretne...
Tako da odustajem...

Jedino ako se koristi file() pa onda arrayom da se čita iz poslednjeg do prvog ali nisam tako dobar u array-u a i mrzime da se sada time bakćem.Da vidim kako će ostali da reše ovo. ;)
 
Odgovor na temu

-zombie-
Tomica Jovanovic
freelance programmer
ni.ac.yu

Član broj: 4128
Poruke: 3448
*.dial.InfoSky.Net

Sajt: localhost


+5 Profil

icon Re: Rotiranje fajla21.05.2003. u 20:52 - pre 254 meseci
ma ne valja ni jedan skript jezik za ovo.. čak ni perl majka nije dobra pri baš velikim količinama memorije..


moja prva ideja je da se fajl u letu iscepka na delove (od par mega, recimo od po 10M), i da se oni okrenu.. ali je problem što i ti delovi treba da se ispišu nazad u obrnutom poretku..

naravno, pretpostavljam da snimanje na disk ovivh iscepkanih delova fajla nije dozvoljeno (tj jednostavno nema mesta ;)
 
Odgovor na temu

Gojko Vujovic
Amsterdam, NL

Administrator
Član broj: 1
Poruke: 13651



+165 Profil

icon Re: Rotiranje fajla22.05.2003. u 00:02 - pre 254 meseci
Za sve unix ima rešenje. Pogledaj tac komandu iz textutils paketa. Suprotno od cat, jel'te. :)

Negde će to biti i gtac (od GNU valjda), zavisi već od sistema.
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.telia.com

Sajt: dejan.lekic.org


+2 Profil

icon Re: Rotiranje fajla22.05.2003. u 23:45 - pre 254 meseci
Gojko,
hvala - nisam znao za ovo programče! :)

Pozdrav svima!
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

Gojko Vujovic
Amsterdam, NL

Administrator
Član broj: 1
Poruke: 13651



+165 Profil

icon Re: Rotiranje fajla23.05.2003. u 01:31 - pre 254 meseci
Nisam stigao prošlog puta da se pozabavim ostalim alatkama, ali pošto me tOwk još uvek nije preduhitrio i dao rešenje, uradiću to sada:

Perl:

Code:
cat fajl.txt | perl -e 'print reverse <>'


Awk:

Code:
cat fajl.txt | awk '{g[NR]=$0}END{for(n=NR;n>0;n--)print g[n]}'


Sed:

Code:
cat fajl.txt | sed -n '1!G;h;$p'


Sa velikim fajlovima perl ubedljivo najbrži od ova tri. Sa sedom ni ne pokušavaj, udavi se bukvalno kad je veliki fajl u pitanju.

Ja mislim da sad imaš dovoljno rešenja, Leko. :) Aj' molim te testiraj performanse perl rešenja u odnosu na "tac", baš me zanima kako će se ponašati u realnoj upotrebi.
 
Odgovor na temu

Gojko Vujovic
Amsterdam, NL

Administrator
Član broj: 1
Poruke: 13651



+165 Profil

icon Re: Rotiranje fajla23.05.2003. u 01:44 - pre 254 meseci
Mada nije za scripting forum, evo ti Leko i u C-u isto to:

Code:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXREAD 4096

int main(int argc, char *argv[]) {
    int nread, len = 0, size = (4 * MAXREAD);
    char *cp, *offset, *buf = malloc(size + 1);

    while (1) {
    if ((nread = read(0, (buf + len), MAXREAD)) > 0) {
        len += nread;
        if (MAXREAD > (size - len)) {
        size <<= 1;
        if (0 == (buf = realloc(buf, size + 1))) {
            fprintf(stderr, "realloc failed\n");
            exit(1);
        }
        }
    } else {
        if ( 0 == nread) break;
        if (-1 == nread) {
        perror("read");
        exit(1);
        }
    }    
    }
    offset = buf + len;
    *offset = 0;
    for (cp = offset; cp > buf; --cp) {
    if ('\n' == *cp) {
        *offset = 0;
        if (cp < offset)
        fputs(offset = cp+1, stdout);
    }
    }
    if (cp < offset) {
    *offset = 0;
    fputs(cp, stdout);
    }
    free(buf);
    return(0);
}


Nije moj kod, naleteo sam na nekoj njuzgrupi na to..

Zatim pascal:

Code:

Program reversefile;
uses SysUtils, Classes;

var
    i, N : longint;
    list : TList;
    line : string;
    pline : pointer;    
begin
    list := TList.Create;
    While Not Eof(input) do
    begin
        Readln(input, line);
        Getmem(pline, Length(line)+1);
        Move(line, pline^, Length(line)+1);
        list.Add( pline );
    end;
    N := list.Count;
    For i := N-1 Downto 0 do WriteLn( string(list.items[i]^) );
end.


Java:

Code:


import java.io.*;
import java.util.*;

public class reversefile {
    public static void main(String[] args) {
        ArrayList al = new ArrayList(4096);

        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
            String strLine;
            while((strLine = in.readLine()) != null)
                al.add(strLine);
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(1);
        }

        String strArray[] = new String[al.size()];
        al.toArray(strArray);

        for(int i = strArray.length - 1; i >= 0; i--)
            System.out.println(strArray[i]);
    }
}


 
Odgovor na temu

Gojko Vujovic
Amsterdam, NL

Administrator
Član broj: 1
Poruke: 13651



+165 Profil

icon Re: Rotiranje fajla23.05.2003. u 01:49 - pre 254 meseci
Igri nikad kraja. Ne snalaze se svi sa velikim fajlovima ali sa malima rade.

Evo i php rešenja:

Code:

$fd = fopen("php://stdin", "r");
$lines = array();
while (!feof ($fd)) { array_push($lines, fgets($fd, 4096)); }
fclose($fd);
foreach (array_reverse($lines) as $line) print $line;


Zatim python:

Code:

def main():
    from sys import stdin, stdout
    w = stdin.readlines()
    w.reverse()
    stdout.writelines(w)

main()


Pokrao sam kod ali nema veze, uživajte.

TCL:

Code:

proc main {} {
    set lines [split [read stdin] "\n"]
    
    fconfigure stdout -buffering full

    for {set i [expr {[llength $lines]-2}]} {$i >= 0} {incr i -1} {
        puts [lindex $lines $i]
    }
}

main


Može čak i VBSCRIPT to:

Code:

FileBlob = WScript.StdIn.ReadAll
Lines = Split(FileBlob, Chr(10))
For A = UBound(Lines) To LBound(Lines) Step -1
    If Len(Lines(A)) > 0 Then WScript.Echo Lines(A)
Next


Naravno i c++:

Code:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

int main() {
    typedef vector<string> LINES;
    LINES l;
    char line[256];
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    while (cin.getline(line, 256)) {
        l.push_back(line);
    }
    for (LINES::reverse_iterator j = l.rbegin(); j != l.rend(); j++) {
    cout << (*j) << endl;
    }    
}


 
Odgovor na temu

Gojko Vujovic
Amsterdam, NL

Administrator
Član broj: 1
Poruke: 13651



+165 Profil

icon Re: Rotiranje fajla23.05.2003. u 02:16 - pre 254 meseci
Evo još jednog:

Code:

nl fajl.txt | sort -r | cut -c8-


Hvala t0wk-u za inspiraciju! :)
 
Odgovor na temu

tOwk
Danilo Šegan
Zemun/Beograd

Član broj: 94
Poruke: 2743
*.beograd-3.tehnicom.net

ICQ: 9344053
Sajt: alas.matf.bg.ac.yu/~mm011..


+2 Profil

icon Re: Rotiranje fajla23.05.2003. u 02:28 - pre 254 meseci
Kad već idemo, evo i bash skripte:
Code:

#!/bin/sh
function unazad {
    local RED
    read RED
    if [ ! $? = 1 ]; then
        unazad
        echo $RED
    fi
}
unazad


Takođe, ovo možete definisati u .profile, i onda koristiti „unazad“ za isti posao ;-) Naravno, ovo je samo za manje fajlove

[Ovu poruku je menjao tOwk dana 23.05.2003. u 02:50 GMT]
Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.
 
Odgovor na temu

Gojko Vujovic
Amsterdam, NL

Administrator
Član broj: 1
Poruke: 13651



+165 Profil

icon Re: Rotiranje fajla23.05.2003. u 02:31 - pre 254 meseci
Merenje performansi na nekim manjim fajlovima, po zauzeću procesora, daje sledeći poredak (prvi najbrži):

1.tac
2.gcc
3.g++
4.java
5.perl
6.tcl
7.gawk
8.php

A po zauzeću memorije (prvi zauzima najmanje memorije):

1.tac
2.gcc
3.g++
4.tcl
5.java
6.perl
7.gawk
8.php

Neverovatno kakvo je đubre ovaj php a opet tako popularan.
 
Odgovor na temu

_owl_

Član broj: 318
Poruke: 1043
*.drenik.net



+3 Profil

icon Re: Rotiranje fajla23.05.2003. u 10:10 - pre 254 meseci
Citat:

Neverovatno kakvo je đubre ovaj php a opet tako popularan.

Nije php djubre nego si ti napisao najgori moguci kod za ovaj zadatak. Procitao si ceo fajl i smestio ga u niz (bas bi bilo zanimljivo da si probao sa onim fajlom od 10GB).
Vidi da prebaci kod u C-u u PHP pa onda uporedi (ne znam samo sta radi funkcija nread, a nisam pri *nix-u da pogledam man). U svakom slucaju php bi morao da bude sporiji od C-a.
Owl
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.telia.com

Sajt: dejan.lekic.org


+2 Profil

icon Re: Rotiranje fajla23.05.2003. u 11:27 - pre 254 meseci
Aman narode, da sam hteo da sednem i iskodiram ovo ja bih to odradio, bio sam zapravo uveren da za tako jednostavnu stvar postoji jednolinijsko resenje u shell-u, i ponovo zahvaljujem Gojku za komandu tac , ovo ostalo sto ste kucali mozda je interesantno za neke ljude koji uce programiranje, tako da i to treba postovati...
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

Gojko Vujovic
Amsterdam, NL

Administrator
Član broj: 1
Poruke: 13651



+165 Profil

icon Re: Rotiranje fajla23.05.2003. u 13:19 - pre 254 meseci
OWL: i Java kod je isto loš i radi tako što sve gura u arraylist pa onda kroz petlju čita unazad. Pa je opet Java odradila sve za skoro upola kraće vreme.

Hajde napišite bolji PHP kod, meni nešto ne ide. :)
 
Odgovor na temu

tOwk
Danilo Šegan
Zemun/Beograd

Član broj: 94
Poruke: 2743
*.beograd-3.tehnicom.net

ICQ: 9344053
Sajt: alas.matf.bg.ac.yu/~mm011..


+2 Profil

icon Re: Rotiranje fajla23.05.2003. u 17:15 - pre 254 meseci
Gojko, radi li ti sada ovo moje rešenje? Ako radi, 'ajde ga uporedi i sa ostalima ;-) Ja mu dajem neko 7, 8 mesto.
Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.
 
Odgovor na temu

Goran Rakić
Beograd

Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: Rotiranje fajla23.05.2003. u 23:37 - pre 254 meseci
Code:

#!/usr/local/bin/php

<?php
$fd = fopen("php://stdin", "r");
$fd1 = fopen("php://stdout", "w");

$i=-1;
$red=array();
$prvi = fgetc($fd);

  fseek($fd,0,SEEK_END);

   while( ftell ($fd) != 0 ) {

         $c=fgetc($fd);
    array_push($red, $c);

         if($c=="\n") {
        $red=array_reverse($red);
        foreach($red as $r) fwrite($fd1,$r);
        $red=array();
    }

           fseek($fd,$i,SEEK_END);
    $i--;

   }

        fwrite($fd1,"\n$prvi");
        $red=array_reverse($red);
        foreach($red as $r) fwrite($fd1,$r);
        fwrite($fd1,"\n");

fclose($fd);
fclose($fd1);
?>


./obrni.php < dat daje izlaz na ekran...

mana je što na vrhu postoji nekoliko \n oznaka, zato što zadnji red završava sa novom linijom.
http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

tOwk
Danilo Šegan
Zemun/Beograd

Član broj: 94
Poruke: 2743
*.beograd-3.tehnicom.net

ICQ: 9344053
Sajt: alas.matf.bg.ac.yu/~mm011..


+2 Profil

icon Re: Rotiranje fajla24.05.2003. u 00:27 - pre 254 meseci
Pa to je lako ispraviti. Takođe, ja bih koristio stringove svuda umesto niza, a ako već koristiš niz, onda je bolje array_unshift (da ne bi morao reverse).

Evo (nadam se) poboljšane verzije:
Code:

#!/usr/local/bin/php -q
<?php
$fd = fopen("php://stdin", "r");

$red='';
fseek($fd,-1,SEEK_END);

while( (($c=fgetc($fd))!=NULL) && (ftell ($fd) != 1 )) {
  
  if($c=="\n") {
    echo $red;
    $red=$c;
  } else {
    $red=$c.$red;
  }
  
  fseek($fd,-2,SEEK_CUR);
}
echo $c.$red;

fclose($fd);

?>


Dopuna: bila mi je ostala jedna Goranova greška :-), sad je i to sređeno. Takođe još neka pojednostavljenja. Ispravljena i jedna moja greška pošto PHP ASCII 0x30 (nulu) tretira takođe kao FALSE... ehhh...
Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.
 
Odgovor na temu

tOwk
Danilo Šegan
Zemun/Beograd

Član broj: 94
Poruke: 2743
*.beograd-3.tehnicom.net

ICQ: 9344053
Sajt: alas.matf.bg.ac.yu/~mm011..


+2 Profil

icon Re: Rotiranje fajla24.05.2003. u 01:35 - pre 254 meseci
Testirajući ovaj PHP skript koji je praktično urađen onako kako bi C verzija trebala da bude urađena zaključio sam da PHP i dalje „kešira“ izlaz, i primetite ovaj rezultat na fajlu od oko 900kb i oko 9000 linija:
Code:

# time tac ~/rad/katalogizacija/spisak/sve >/dev/null

real    0m0.063s
user    0m0.040s
sys     0m0.000s
# time php -q ./proba2.php <~/rad/katalogizacija/spisak/sve  >/dev/null

real    0m50.984s
user    0m26.440s
sys     0m0.880s


Zato, mada bi u suštini ovaj kod trebao da radi i na beskonačnim fajlovima, PHP to zbog internog procesiranja čini nemogućim.
Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.
 
Odgovor na temu

Gojko Vujovic
Amsterdam, NL

Administrator
Član broj: 1
Poruke: 13651



+165 Profil

icon Re: Rotiranje fajla24.05.2003. u 01:40 - pre 254 meseci
Tac verovatno nije isto što i ona C verzija odozgo, dakle treba pogledati source tac-a.

Uglavnom na testu mi je tac ispao brži od onog c koda gore.
 
Odgovor na temu

[es] :: Skript jezici :: Rotiranje fajla

Strane: 1 2

[ Pregleda: 5611 | Odgovora: 31 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.