Ordinare un file, nel senso di sortarlo

Ebbene sì! sono in ritardo 8) per vari motivi. Ecco il primo: Walterdikiyvolk ha un log di mezzo milione di righe, da sortare.
Allora la prima idea è quella di creare uno script Python, l’ha fatto Walter, eccolo (TestFileM.py)

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

import time

try:
	# lettura del file
	t0 = time.time()
	print "Tempo inizio: ", time.strftime("%H:%M:%S")
	file_input = open("Note.txt", "ru")  #credo che u non serva
	lines = file_input.readlines()
	file_input.close()
	t1 = time.time()
	print "Tempo fine: ", time.strftime("%H:%M:%S")
	print "Tempo di caricamento dei dati: ", t1 - t0, "secondi"

	# ordinamento del file
	t0 = time.time()
	print "Tempo inizio: ", time.strftime("%H:%M:%S")
	lines.sort()
	print "Elementi caricati: ", len(lines)
	t1 = time.time()
	print "Tempo fine: ", time.strftime("%H:%M:%S")
	print "Tempo di ordinamento dei dati: ", t1 - t0, "secondi"
	print "Elemento 1: ", "*" + lines[0] + "*", len(lines[0])
	#for c in range (0, len(lines[0])):
	#	print c, ord(lines[0][c])
	numlines = len(lines)
	print "Elemento", str(numlines) + ": ", '*' + lines[numlines-1] + '*', \
					len(lines[numlines-1])
	#for c in range (0, len(lines[numlines-1])):
	#	print c, ord(lines[numlines-1][c])
	file_output = open("NoteOut.txt", "w")
	file_output.writelines(lines)
	file_output.close()
except(IOError):
	print "Errore nell'elaborazione del file lista.txt"
	quit()

Funziona, in una frazione di secondo crea il file di output di 19.8 MB. C’è un problema: il file originale usa un set di caratteri con codifica sconosciuta per cui alcuni caratteri non vengono visualizzati correttamente.
Le mie prove a sostituire la direttiva # -*- coding: utf-8 -*- non hanno portato altro risultato oltre a quello di innervosirmi 😦

Allora ho pensato: ma c’è un linguaggio che per queste cose è l’ideale; anzi è l’ideale per tutto 😀 per chi ancora non avesse capito sto parlando di newLISP 8)

È incredibile come si fa in fretta a dimenticare le cose, è trascorso qualche mese dal mio ultimo script e ho dimenticato i nomi delle funzioni, continuavo a mettere delle virgole per separare le variabili, non aprivo le parentesi, insomma non sono affatto quel wannabe-geek che vorrei 😦

Comunque, dopo una consultazione del manuale davvero eccessiva –a proposito Internet funzionava a singhiozzo–, ecco lo script (wsort.nl).

;; leggo
(set 'inname "Note.txt")
(set 'txt (read-file inname))
(println (length txt))
(set 'righe (parse txt "\n"))
(set 'L (length (righe -1)))
(if (= 0 L)
    (pop righe -1))

;; sort
(set 'righe (sort righe))

;; scrivo
(write-file "NoteOut2.txt" (join righe "\n"))

(exit)

Funziona, con la stessa velocità dello script Python, produce lo stesso risultato.

Ma, aspetta un attimino: mi sono dimenticato del comando Unix/Linux sort?
Produce lo stesso risultato, è più lento, davvero 8)

Ma c’è anche un altro motivo per questa distrazione e per il ritardo accumulato: c’è la festa patronale del paese 😀

Buona festa a tutti, adesso mi metto a lavorare, davvero. Comincio con farmi un caffè, forte 8)

Posta un commento o usa questo indirizzo per il trackback.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: