Autore |
Discussione  |
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 05 dicembre 2012 : 15:41:54
|
Text Deduplicator Plus is a utility for de-duplicating lines in a text file list. Text De-duplication
This utility is especially useful for de-duplicating list of information to make them unique before importing into a database as lookup tables. Sorting Lists
As a by-product of de-duplication list are also sorted into alphabetical order. If you wish to just sort a list without de-duplicating click the sort only button.
Totalling
If you wish to total up the number of each item in a list click count dupes. This will produce a totals list of the items in the list.
|
|
MEM
Utente Master
Regione: Puglia
Prov.: Lecce
Città: Galatone
2235 Messaggi |
Inserito il - 11 gennaio 2013 : 10:34:09
|
Questo Text Deduplicator Plus e' veramente ottimo e pensavo risolvesse il mio problema, ma non e' cosi'. Avrei bisogno di eliminare in un elenco.txt non solo i doppioni, ma anche gli originali in modo che restino solo le voci che sono state sempre singole. Lista di partenza: Pippo Pippo Pippo Pluto Topolino Topolino Minnie Risultato: Pluto Minnie
Chi mi aiuta? Non riesco a trovare un programma adatto. |
Modificato da - MEM in data 11 gennaio 2013 12:30:36 |
 |
|
MEM
Utente Master
Regione: Puglia
Prov.: Lecce
Città: Galatone
2235 Messaggi |
Inserito il - 14 gennaio 2013 : 10:00:28
|
Ho l'impressione di essere ignorato... |
 |
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 14 gennaio 2013 : 10:14:08
|
Bah, si potrebbe provare il solito lisp "ad hoc"... |
 |
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 14 gennaio 2013 : 14:42:01
|
Ecco fatto, dimmi se funziona. Il programma, abbastanza banale, non fa altro che prendere il file txt, convertirlo in una lista e costruire una nuova lista con gli elementi presenti singolarmente nella prima lista. A questo punto travaso finale della nuova lista in un file txt avente lo stesso nome del precedente con suffisso _NEW. All'interno la funzione vl-position-t che restituisce tutte le posizioni di un certo elemento della lista (la funzione esistente vl-position mi dà solo la prima posizione di un elemento).
;;; Comando che elimina da un elenco txt tutti gli elementi non singoli
(defun C:ELIMDATI (/ datifile cartella intesto listatxt riga listatxt2 outtesto)
(setq datifile (getfiled "Scegli il tuo file" "c:\\" "txt" 4)
cartella (strcat (vl-filename-directory datifile) "\\")
intesto (open datifile "r")
listatxt '()
)
(while (setq riga (read-line intesto))
(setq listatxt (cons riga listatxt))
)
(setq listatxt (reverse listatxt))
(close intesto)
(setq listatxt2 '())
(foreach elem listatxt
(if (= (length (vl-position-t elem listatxt)) 1)
(setq listatxt2 (cons elem listatxt2))
)
)
(setq listatxt2 (reverse listatxt2)
outtesto (open (strcat cartella (vl-filename-base datifile) "_NEW.TXT") "w")
)
(foreach elem listatxt2
(princ elem outtesto)
(princ "\n" outtesto)
)
(close outtesto)
)
(princ "ELIMDATI - by Terminator - vers.1")
(princ "\nDigitare ELIMDATI"
;;; ***************************FUNZIONE VL-POSITION-T*******************************
;;; Funzione che elenca le posizioni di un certo elemento in una lista
(defun vl-position-t (elemento listan / lista contatore)
(setq lista '())
(setq contatore 0)
(foreach elem listan
(if (= elem elemento)
(setq lista (append lista (list contatore)))
)
(setq contatore (1+ contatore))
)
lista
)
|
 |
|
Giuseppe Mauro
Amministratore

Regione: Campania
Prov.: Napoli
2707 Messaggi |
Inserito il - 14 gennaio 2013 : 18:23:01
|
Dopo quanti lisp, ci si candida alla santità ?? 
|
 |
|
MEM
Utente Master
Regione: Puglia
Prov.: Lecce
Città: Galatone
2235 Messaggi |
Inserito il - 15 gennaio 2013 : 10:23:12
|
Non funziona. Dopo aver lanciato ELIMDATI e selezionato il file TXT mi da questo errore:
; error: no function definition: VL-POSITION-T
Purtroppo non mi intendo di Lisp e non so interpretarlo. |
 |
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 15 gennaio 2013 : 11:40:17
|
Messaggio inserito da MEM
Non funziona. Dopo aver lanciato ELIMDATI e selezionato il file TXT mi da questo errore:
; error: no function definition: VL-POSITION-T
Purtroppo non mi intendo di Lisp e non so interpretarlo.
all'inizio devi inserire
(vl-load-com)
http://www.cadlandia.com/topic.asp?TOPIC_ID=13749&SearchTerms=function,definition: |
Modificato da - arri in data 15 gennaio 2013 11:41:40 |
 |
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 15 gennaio 2013 : 11:56:30
|
Ci risiamo... |
 |
|
MEM
Utente Master
Regione: Puglia
Prov.: Lecce
Città: Galatone
2235 Messaggi |
Inserito il - 15 gennaio 2013 : 12:32:02
|
Ragazzi, non capisco, all'inizio di cosa devo mettere (vl-load-com)? Scusatemi ancora. |
 |
|
MEM
Utente Master
Regione: Puglia
Prov.: Lecce
Città: Galatone
2235 Messaggi |
Inserito il - 15 gennaio 2013 : 12:59:25
|
Ho copiato e incollato tutto al Command, ma il risultato e' sempre: ; error: no function definition: VL-POSITION-T Dove sbaglio? |
 |
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 15 gennaio 2013 : 13:15:54
|
Messaggio inserito da MEM
Ho copiato e incollato tutto al Command, ma il risultato e' sempre: ; error: no function definition: VL-POSITION-T Dove sbaglio?
attendi Terminator |
 |
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 15 gennaio 2013 : 13:18:52
|
Scarica allegato:
elimdati.zip 1,08 KB |
 |
|
MEM
Utente Master
Regione: Puglia
Prov.: Lecce
Città: Galatone
2235 Messaggi |
Inserito il - 15 gennaio 2013 : 13:31:48
|
Intanto... grazie. Ho caricato il Lisp, ma compare subito: ELIMDATI - by Terminator - vers.1; error: malformed list on input poi dopo aver lanciato ELIMDATI e scelto il file txt contenente l'elenco: ; error: no function definition: VL-POSITION-T
Il mio elenco.txt e' del tipo: staffa bulzen staffa kroken vite zanni vite stender ecc.
La lista e di circa 50000 righe. |
Modificato da - MEM in data 15 gennaio 2013 13:32:24 |
 |
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 15 gennaio 2013 : 14:26:33
|
| Messaggio inserito da MEM
Intanto... grazie. Ho caricato il Lisp, ma compare subito: ELIMDATI - by Terminator - vers.1; error: malformed list on input poi dopo aver lanciato ELIMDATI e scelto il file txt contenente l'elenco: ; error: no function definition: VL-POSITION-T
Il mio elenco.txt e' del tipo: staffa bulzen staffa kroken vite zanni vite stender ecc.
La lista e di circa 50000 righe.
|
Ehm...avevo dimenticato una parentesi all'ultimo princ e questo impediva il caricamento della funzione vl-position-t...
Scarica allegato:
elimdati.zip 1,1 KB |
 |
|
joseph
Utente Master

Regione: Lombardia
Prov.: Cremona
Città: Casalmaggiore
1884 Messaggi |
Inserito il - 16 gennaio 2013 : 11:18:51
|
Anche se il problema è già stato risolto, brillantemente e velocemente, vi allego questa funzione alternativa. Ho solo sfruttato la riga di codice: (apply 'append (subst nil...... che ho trovato sicuramente su qualche forum (ma purtroppo non ricordo più quale). L'ho solo provata su liste, tipo quelle allegate; è da testare.
(defun dopp () (setq lista () lista-p ()) ;(setq lista '("a" "r" "g" "t" "b" "a" "s" "r")) (setq lista '(7 3 6 4 5 3 2 9 9 8 9 9 )) (setq ll (length lista)) (while (>= ll 1) (setq x (car lista)) (if (/= (vl-position x (cdr lista)) nil) (setq lista (apply 'append (subst nil (list x) (mapcar 'list lista)))) (progn (setq lista-P (cons x lista-p) lista (cdr lista)) ) );if (setq ll (length lista)) ) ; while (reverse lista-p) )
|
 |
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 16 gennaio 2013 : 14:59:34
|
Bellissimo metodo, ottimo Jo! 
Avevo intuito che forse c'era un modo di sfruttare il vl-position originale, ma alla fine mi sono rassegnato ad usare il metodo più grezzo. |
 |
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 16 gennaio 2013 : 16:43:01
|
Ho provato ad intraprendere un'altra strada per sfruttare il vl-position esistente, questo è il risultato:
;;; Funzione che elenca le posizioni di un certo elemento in una lista
(defun vl-position-t (elemento listan / lista-p lung1 lung2)
(setq lista-p '()
lung1(length listan)
lung2(length listan)
)
(while (< (- lung1 lung2) lung1)
(if (vl-position elemento listan)
(setq lista-p (cons (+ (vl-position elemento listan)(- lung1 lung2)) lista-p))
)
(setq listan(cdr(member elemento listan)))
(setq lung2(length listan))
)
(setq lista-p(reverse lista-p))
) |
 |
|
MEM
Utente Master
Regione: Puglia
Prov.: Lecce
Città: Galatone
2235 Messaggi |
Inserito il - 18 gennaio 2013 : 13:03:59
|
Grazie Terminator, solo oggi ho potuto testare elimdati.lsp. Su un file di 60 righe ha lavorato egregiamente. Su un file di 50.000 righe dopo un buon quarto d'ora l'ho fermato io. Ripetero' la prova appena possibile e vi faro' sapere.
Quello che avete aggiunnto dopo con joseph non lo so usare. |
 |
|
joseph
Utente Master

Regione: Lombardia
Prov.: Cremona
Città: Casalmaggiore
1884 Messaggi |
Inserito il - 18 gennaio 2013 : 13:55:27
|
| Messaggio inserito da MEM ...... Quello che avete aggiunnto dopo con joseph non lo so usare.
|
La mia era solo una variante alla parte centrale della soluzione di Terminator; non fa niente di più. Forse si dovrebbe confrontare la velocità dei due metodi (soprattutto su file da 50000 righe). |
 |
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 18 gennaio 2013 : 15:49:11
|
@MEM
Prova a lasciarlo più tempo invece di un quarto d'ora. |
 |
|
Discussione  |
|