ďťż
 
 
   [+] Pobieranie losowej linii z pliku
 
 

Tematy

 
    
 

 

 

 

[+] Pobieranie losowej linii z pliku





Akkon - 28-02-2009 17:04
Mam plik tekstowy a w nim kilkaset linijek. Poszukuję jakiegoś mechanizmu, który z tego pliku pobierałby losowo np. jedną linijkę. Na razie znalazłem coś pośredniego
sed -n xp plik dzięki temu sed wyświetla x linię pliku, ale brak tu elementu losowości, na którym mi zależy.

Z góry dziękuję za pomoc



ponton - 28-02-2009 17:36
Na szybko w Perlu: wczytuje plik (podany jako pierwszy argument) do pamięci, a potem losuje wiersz i go wypisuje:

#!/usr/bin/perl

if ($#ARGV > 0)
{
        open(FILE, $ARGV[1]);
        @file = <FILE>;
        my $index = rand @file;
        my $line = @file[$index];
        print $line;
        close FILE;
}
else
{
        print "Missing argument!\n"
}



Akkon - 28-02-2009 17:51

Na szybko w Perlu Dzięki. Gdybyś był jeszcze tak miły i napisał, takiej całkowitej lamie z programowania jak ja :mrgreen: , w którym dokładnie miejscu mam podać lokalizację do mojego pliku?



beel - 28-02-2009 18:03
Albo z Pythonem, na jeszcze szybciej:

import linecache
import random

filePath = "/home/beel/zadanie/przypadkowy"

liczba_linii = len(open(filePath, 'rU').readlines())
print linecache.getline(filePath, random.randint(0,liczba_linii))
linecache.clearcache() ÂŚcieżkę widać gdzie podać. Linie losuje na całej zawartości pliku.



Akkon - 28-02-2009 18:53
beel, Twój skrypcik pięknie działa - dzięki. Mam tylko jedno pytanie. Edytowałeś swojego posta może, bo wcześniej było tak:
print linecache.getline(filePath, random.randint(1,100))
linecache.clearcache() a jest tak:
liczba_linii = len(open(filePath, 'rU').readlines())
print linecache.getline(filePath, random.randint(0,liczba_linii))
linecache.clearcache() Rozumiem, że wcześniej było tak, że wybierał linie z przedziału od 1 do 100?
random.randint(1,100) ?



beel - 28-02-2009 18:55
Tak, zgadza się, edytowałem aby .. wyliczał linie i z całego zbioru losował. Wcześniej trzeba było ustawiać na sztywno..



ponton - 01-03-2009 09:08

Na szybko w Perlu Dzięki. Gdybyś był jeszcze tak miły i napisał, takiej całkowitej lamie z programowania jak ja :mrgreen: , w którym dokładnie miejscu mam podać lokalizację do mojego pliku? W żadnym, zapisujesz to do pliku np. randomline.pl, nadajesz mu prawa do uruchomienia (chmod +x randomline.pl) i wywołujesz: ./randomline.pl plik.txt
Albo z Pythonem, na jeszcze szybciej:

import linecache
import random

filePath = "/home/beel/zadanie/przypadkowy"

liczba_linii = len(open(filePath, 'rU').readlines())
print linecache.getline(filePath, random.randint(0,liczba_linii))
linecache.clearcache()
ÂŚcieżkę widać gdzie podać. Linie losuje na całej zawartości pliku. To jest trochę nieoptymalne najpierw wczytać plik, żeby policzyć liczbę wierszy, a potem znowu wczytać plik, żeby wyświetlić wylosowany wiersz. ;) Ja bym zrobić to tak (nie testowane):

import random

filePath = "/home/beel/zadanie/przypadkowy"

zawartosc = open(filePath, 'rU').readlines()
wiersz = random.randint(0, len(zawartosc))
print zawartosc[wiersz] Do kompletu jeszcze wersja w AWK-u. Przetestuj i wybierz najszybszą. :P

#!/usr/bin/awk -f

BEGIN {
        srand()
        i = 0
}

{
        lines[i] = $0
        ++i
}

END {
        print lines[int(rand()*i)]
} ./randomline.awk < plik.txt



beel - 01-03-2009 10:01

To jest trochę nieoptymalne najpierw wczytać plik, żeby policzyć liczbę wierszy, a potem znowu wczytać plik, żeby wyświetlić wylosowany wiersz. ;) Ja bym zrobić to tak (nie testowane): Zastrzegałem, że na szybko i uwagi na to nie zwracałem..

Dałbym:
wiersz = random.randint(0, len(zawartosc)-1)



Akkon - 01-03-2009 14:53
Jeszcze raz Wam dziękuję za pomoc. Do meritum:

zapisujesz to do pliku np. randomline.pl, nadajesz mu prawa do uruchomienia (chmod +x randomline.pl) i wywołujesz Niestety nie działa cały czas otrzymuję komunikat
Missing argument!
Do kompletu jeszcze wersja w AWK-u. Przetestuj i wybierz najszybszą. :P Tu jest ok.

Dałbym:
Kod:
wiersz = random.randint(0, len(zawartosc)-1)
Skrypt po modyfikacjach działa. Rożnicy w szybkości nie zauważyłem :-D

Po wstępnych testach sądzę, że AWK będzie najwygodniejszy, gdyż plik z danymi nie musi być określony "na sztywno" w skrypcie tak jak jest w propozycji beela, choć z punktu widzenia moich potrzeb to jest w zasadzie marginalna niedogodność.



ponton - 01-03-2009 16:13

Niestety nie działa cały czas otrzymuję komunikat
Missing argument!
Nie piszę w Perlu i jakiś problem miałem z liczbą argumentów... Możesz wykasować tego if-a i else-a i zostawić tylko to, co jest w pierwszej klamrze.



Akkon - 01-03-2009 22:32

Możesz wykasować tego if-a i else-a i zostawić tylko to, co jest w pierwszej klamrze. Problem jest w zasadzie rozwiązany dzięki dwóm pozostałym skryptom, dlatego piszę tylko dla porządku, że ten w Perlu nadal nie działa.

Pozdrawiam



Akkon - 19-06-2010 13:33


Do kompletu jeszcze wersja w AWK-u. Przetestuj i wybierz najszybszą. :P

#!/usr/bin/awk -f

BEGIN {
        srand()
        i = 0
}

{
        lines[i] = $0
        ++i
}

END {
        print lines[int(rand()*i)]
}
./randomline.awk < plik.txt Odświeżę trochę temat. Jak w tym przypadku wymusić by skrypt wybierał losowo, ale tylko spośród tych wartości, które wcześniej się nie pojawiły?
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • minister.pev.pl

  •  

     


     

     
    Copyright 2003. MĂłj serwis