Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2014-06-26 19:48:32

  rafi - Użytkownik

rafi
Użytkownik
Skąd: Częstochowa
Zarejestrowany: 2006-03-12

Automatyczna modyfikacja zawartości pliku txt.

Mam plik tekstowy zawierający słownik włosko-polski w którym potrzebuję usunąć powtarzanie włoskich homonimów w kolejnych liniach.
Jest tak:

Kod:

abaco=abakus
abaco=liczydło
abate=opat
abbacchiare=przygnębiać
abbacchio=baranek
abbacchio=jagnięcy

a chciałbym żeby było tak:

Kod:

abaco=abakus / liczydło
abate=opat
abbacchiare=przygnębiać
abbacchio=baranek / jagnięcy

Proszę o pomoc w postaci linii poleceń albo skryptu, który pozwoli wykonać tę operację automatycznie.


Furie terribili!
Circondatemi,
Sequidatemi
Con faci orribili!

Offline

 

#2  2014-06-27 14:17:36

  uzytkownikubunt - Zbanowany

uzytkownikubunt
Zbanowany
Zarejestrowany: 2012-04-25

Re: Automatyczna modyfikacja zawartości pliku txt.

871

Ostatnio edytowany przez uzytkownikubunt (2016-12-01 00:54:25)

Offline

 

#3  2014-06-27 16:46:31

  ethanak - Użytkownik

ethanak
Użytkownik
Skąd: Ungwenor
Zarejestrowany: 2010-07-19
Serwis

Re: Automatyczna modyfikacja zawartości pliku txt.

Kolego @uzytkownikubunt - gratuluję zajefajnej znajomości C++. Daj w ryj facetowi co Cię tego uczył - a jak spyta za co to daj jeszcze raz.

Kod w Pythonie (w C++ też można tak prosto, zakładamy że plik wejściowy jest posortowany):

Kod:

#!/usr/bin/env python
#coding: utf-8

import sys

last_word=""
ds=[]
while True:
    a=sys.stdin.readline()
    if not a:
        break
    a=a.strip().split('=',1)
    if len(a) != 2:
        continue
    
    if last_word != a[0]:
        if last_word:
                print "%s=%s" % (last_word, " / ".join(ds))
                ds=[]
        last_word=a[0]
    ds.append(a[1])
print "%s=%s" % (last_word, " / ".join(ds))

Działa jak filtr - czyli:

Kod:

python program.py <plik_wejsciowy.txt > plik_wyjsciowy.txt

PS. jeśli nie jest posortowany - kod będzie tak samo krótki, ale będziesz mógł pójść na piwo zanim się wykona.

Ostatnio edytowany przez ethanak (2014-06-27 16:59:10)


Nim mechaniczne larum zagrasz mi, kanalio,
głosząc nadejście Javy - śmiertelnego wroga!
Zespół Adwokacki Dyskrecja

Offline

 

#4  2014-06-27 18:49:15

  uzytkownikubunt - Zbanowany

uzytkownikubunt
Zbanowany
Zarejestrowany: 2012-04-25

Re: Automatyczna modyfikacja zawartości pliku txt.

872

Ostatnio edytowany przez uzytkownikubunt (2016-12-01 00:54:26)

Offline

 

#5  2014-06-28 19:05:11

  ethanak - Użytkownik

ethanak
Użytkownik
Skąd: Ungwenor
Zarejestrowany: 2010-07-19
Serwis

Re: Automatyczna modyfikacja zawartości pliku txt.

a ja jestem ciekaw, na ile mój pyhonowy kod będzie wolniejszy od kodu kolegi.
bo że będzie wolniejszy to wiem...


Nim mechaniczne larum zagrasz mi, kanalio,
głosząc nadejście Javy - śmiertelnego wroga!
Zespół Adwokacki Dyskrecja

Offline

 

#6  2014-06-28 19:11:05

  rafi - Użytkownik

rafi
Użytkownik
Skąd: Częstochowa
Zarejestrowany: 2006-03-12

Re: Automatyczna modyfikacja zawartości pliku txt.

Dziękuje! Oba programy działają znakomicie.
Oto wynik programu w C++ (komp z procesorem Athlon XP 2000+):

Kod:

Obecna data i godzina: Sat Jun 28 18:24:16 2014

Odczytano 28774 linijek z pliku wejsciowego
Zapisano 10674 linijek do pliku
Zakonczono operacje na plikach

Obecna data i godzina: Sat Jun 28 18:24:16 2014

Ostatnio edytowany przez rafi (2014-06-28 19:13:09)


Furie terribili!
Circondatemi,
Sequidatemi
Con faci orribili!

Offline

 

#7  2014-06-28 19:26:53

  ethanak - Użytkownik

ethanak
Użytkownik
Skąd: Ungwenor
Zarejestrowany: 2010-07-19
Serwis

Re: Automatyczna modyfikacja zawartości pliku txt.

a możesz to porównać przez time?


Nim mechaniczne larum zagrasz mi, kanalio,
głosząc nadejście Javy - śmiertelnego wroga!
Zespół Adwokacki Dyskrecja

Offline

 

#8  2014-06-28 19:55:50

  rafi - Użytkownik

rafi
Użytkownik
Skąd: Częstochowa
Zarejestrowany: 2006-03-12

Re: Automatyczna modyfikacja zawartości pliku txt.

OK ale zrobię ten pomiar jutro, gdyż muszę w tej chwili wyjść.


Furie terribili!
Circondatemi,
Sequidatemi
Con faci orribili!

Offline

 

#9  2014-06-28 23:42:37

  prosze - Użytkownik

prosze
Użytkownik
Zarejestrowany: 2012-09-25

Re: Automatyczna modyfikacja zawartości pliku txt.

Kod:

awk -F= '{a[$1]=a[$1] $2 " / " }END{for(b in a) print b "=" a[b]}' wejściowy > wyjściowy

Ostatnie pole "/" usuniesz tak:

Kod:

awk '{FS=OFS=" "}NF--' wyjściowy > końcowy

Offline

 

#10  2014-06-29 12:48:37

  ethanak - Użytkownik

ethanak
Użytkownik
Skąd: Ungwenor
Zarejestrowany: 2010-07-19
Serwis

Re: Automatyczna modyfikacja zawartości pliku txt.

no tak, ale to algorytm dla nieposortowanych danych - a kolega ma dane wejściowe posortowane.


Nim mechaniczne larum zagrasz mi, kanalio,
głosząc nadejście Javy - śmiertelnego wroga!
Zespół Adwokacki Dyskrecja

Offline

 

#11  2014-06-29 15:52:24

  prosze - Użytkownik

prosze
Użytkownik
Zarejestrowany: 2012-09-25

Re: Automatyczna modyfikacja zawartości pliku txt.

Kod:

awk -F= '{a[$1]=a[$1] $2 " / "}END{for(b in a) print b "=" a[b]}' wejściowy | sort -t'=' -k1 | awk '{FS=OFS=" "}NF--' > wyjściowy

Wynik

Kod:

pic@pic:~/Desktop$ cat wejściowy 
abaco=abakus
abaco=liczydło
abate=opat
abbacchiare=przygnębiać
abbacchio=baranek
pic@pic:~/Desktop$ awk -F= '{a[$1]=a[$1] $2 " / "}END{for(b in a) print b "=" a[b]}' wejściowy | sort -t'=' -k1 | awk '{FS=OFS=" "}NF--'
abaco=abakus / liczydło
abate=opat
abbacchiare=przygnębiać
abbacchio=baranek / jagnięcy
pic@pic:~/Desktop$

Ostatnio edytowany przez prosze (2014-06-29 15:55:31)

Offline

 

#12  2014-06-29 16:25:26

  ethanak - Użytkownik

ethanak
Użytkownik
Skąd: Ungwenor
Zarejestrowany: 2010-07-19
Serwis

Re: Automatyczna modyfikacja zawartości pliku txt.

ale zrozumiałeś o czym pisałem czy na chama chcesz udowodnić, że napisałeś super jednolinijkowca (pomijając fakt, że do działania wymaga drugiego jednolinijkowca, a przy paruset tysiącach rekordów klęknie) czy to, że opanowałeś podstawy awka?
napisz kod w awku, który pobiera dane posortowane i nie wymaga dodatkowego skryptu do usuwania błędnych linii. naprawdę się da!


Nim mechaniczne larum zagrasz mi, kanalio,
głosząc nadejście Javy - śmiertelnego wroga!
Zespół Adwokacki Dyskrecja

Offline

 

#13  2014-06-29 17:17:05

  prosze - Użytkownik

prosze
Użytkownik
Zarejestrowany: 2012-09-25

Re: Automatyczna modyfikacja zawartości pliku txt.

ethanak, kolego celowo tak napisałem bo widzę, że zawsze lubisz postawić na swoim ;)

Offline

 

#14  2014-06-29 17:23:40

  rafi - Użytkownik

rafi
Użytkownik
Skąd: Częstochowa
Zarejestrowany: 2006-03-12

Re: Automatyczna modyfikacja zawartości pliku txt.

A oto rezultaty time

uzytkownikubunt, C++:

Kod:

real    0m0.630s
user    0m0.132s
sys     0m0.136s

ethanak, Python:

Kod:

real    0m0.390s
user    0m0.224s
sys     0m0.020s

prosze, awk:

Kod:

real    0m0.939s
user    0m0.360s
sys     0m0.016s

Przy czym w tym ostatnim wystąpiły zmiany w porządku sortowania linii.

Orginalny plik słownika można pobrać stąd, gdyby komuś chciało się jeszcze poeksperymentować. :)


Furie terribili!
Circondatemi,
Sequidatemi
Con faci orribili!

Offline

 

#15  2014-07-02 22:08:56

  dominbik - Członek DUG

dominbik
Członek DUG
Zarejestrowany: 2011-07-25

Re: Automatyczna modyfikacja zawartości pliku txt.

@uzytkownikubunt na studiach to mogą co najwyżej pobieżnie przybliżyć daną dziedzinę. Generalnie dużo studentów ma nastawienie typu "byle zaliczyć" "byle działało" w przypadku tych rzeczy, które ich nie interesują i jest to naturalne. Gorzej tylko jak ludzie się zniechęcają, bo ten system po drugiej stronie działa mniej więcej analogicznie. Na samym początku uczą podstawowej składni, konstrukcji potem algorytmy, jakieś problematyczne nudne zadanka typu te na SPOJu, ale nikt na początku nie pokazuje jak ten kod prawidłowo dzielić na różne funkcje / struktury / moduły / abstrakcyjne byty, jak to powinno wyglądać, wzorce projektowe . , jak te problemy można przyjemnie łatwo rozwiązywać.. Potem taki początkujący zraża się zagubiony będąc w 10 zagnieżdżeniu IFa próbując napisać coś większego albo zbiera się pokłosie studentów trzech zet zakup, zalicz, zapij.

Jako taka ciekawostka w, C++ sam mechanizm takiego słownika można ująć w jednej klasie mniej więcej coś takiego;

Kod:

class Dictionary {
public:
    Dictionary() {}
    void add(std::string word, std::string definition) {
        words[word].push_back(definition);
    }
    ~Dictionary() {}

private:
    typedef std::list<std::string> definitions;
    std::map<std::string,definitions> words;
};

nie trzeba żadnych cudów, ifów. Gdy użyjemy slownik.add("slowko","kolejneznaczenie"); z automatu albo tworzy nowy klucz i dodaje wartość albo jeżeli słowo klucz istnieje dodaje po prostu kolejne znaczenie.do tego jakieś dwie klasy zajmujące się tworzeniem takiego slownika z pliku/zapisywaniem do pliku i tyle ;]


http://img34.imageshack.us/img34/5092/zw9m.png http://img29.imageshack.us/img29/219/pibw.png

Offline

 

#16  2014-07-03 10:25:18

  hello_world - Członek DUG

hello_world
Członek DUG
Skąd: Rymanów Zdrój
Zarejestrowany: 2010-06-03
Serwis

Re: Automatyczna modyfikacja zawartości pliku txt.

Muszę wtrącić tzw "przysłowiowe dwa słowa"
wnerwia mnie typ ethank ze swoim podejsciem do ludzi na tym forum.
Osobiscie przyjebałbym mu w ryj.
jak ma kompleksy na forum programowania w c/c++ wsród profesionalnych programistów i przychodzi się powynaturzać na forum debiana to osobiście mówię: wypierdalaj z tego forum jak masz więcej w człowieku zabić niż mu pomóc.
Gnida parafialna.

Offline

 

#17  2014-07-03 10:31:19

  yossarian - Szczawiożerca

yossarian
Szczawiożerca
Skąd: Shangri-La
Zarejestrowany: 2011-04-25

Re: Automatyczna modyfikacja zawartości pliku txt.

hello_world napisał(-a):

Muszę wtrącić tzw "przysłowiowe dwa słowa"
wnerwia mnie typ ethank ze swoim podejsciem do ludzi na tym forum.
Osobiscie przyjebałbym mu w ryj.
jak ma kompleksy na forum programowania w c/c++ wsród profesionalnych programistów i przychodzi się powynaturzać na forum debiana to osobiście mówię: wypierdalaj z tego forum jak masz więcej w człowieku zabić niż mu pomóc.
Gnida parafialna.

Akurat Twoje zachowanie w tym przypadku bardziej pasuje do tego opisu.

Proponuję (wszystkim) trochę zimnej wody na rozgorączkowane głowy.
Dziecinne pyskówki nie są nigdzie mile widziane.

Offline

 

#18  2014-07-03 11:56:49

  uzytkownikubunt - Zbanowany

uzytkownikubunt
Zbanowany
Zarejestrowany: 2012-04-25

Re: Automatyczna modyfikacja zawartości pliku txt.

880

Ostatnio edytowany przez uzytkownikubunt (2016-12-01 00:54:36)

Offline

 

#19  2014-07-03 12:47:18

  dominbik - Członek DUG

dominbik
Członek DUG
Zarejestrowany: 2011-07-25

Re: Automatyczna modyfikacja zawartości pliku txt.

uzytkownikubunt napisał(-a):

Inna sprawa, że taka lista to nie wiem czy jest wydajna w wielu operacjach. Z tego co rozumiem to element tej listy ma dane + wskaźnik na następny. Jeśli to wszystko jest alokowane za każdym następnym razem, gdy coś jest dodawane i podczas każdego odczytywania musi przejść przez wszystkie elementy, to chyba jednak będzie powoli działał taki kod.

Akurat tutaj przy takim zadanku taka lista wystarcza idealnie (w stosunku do vectora nawet pozbywamy sie resize/realloc'ów ,które mają miejsce przy przekroczeniu rozmiaru vectora). Odnośnie dodawania nowego elementu to zależy od implementacji takiej listy, ale tutaj i w 99% dobrych implementacji lista przechowuje wskaźnik na ostatni element i przy dodawaniu nie musi przelatywać po wszystkich elementach ;]


http://img34.imageshack.us/img34/5092/zw9m.png http://img29.imageshack.us/img29/219/pibw.png

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)