Newsgroup: it.comp.lang.perl
Titolo: %hash ?, Come inserire i valori ?

Una dritta ...please!!
ho due variabili, 25/07/01 (comunque data)  e XXXXXXXXXXX. Queste variabili
cambiano, scorrendo all'interno di un set di recor prelevati da un file. Più
precisamente, il campo della data è una sottostringa di XXXXXXXXXXXX.
Vorrei riordinare con sort il campo "data", faciendo in modo che anche
XXXXXX, si muovano di consegueza.
Grazie
Simon

 XXXXXX, si muovano di consegueza.
@sorted = sort myfun @not_sorted;
poi scrivi la funzione myfun
in modo tale da soddisfare le tue esigenze di sorting.
In particolare (se il file non e' enorme), ti
conviene creare un hash temporaneo che nel tuo caso ti deve dare
%myhash{XXXXXXXXXXX} = '25/07/01'
Spero di esserti stato d'aiuto.
 Raffaello

 ha scritto nel messaggio
news:Pine.OSF.4.31.02091...@harry.molgen.mpg.de...


 wrote in message
news:Ldlh9.101030$ub2.2...@news1.tin.it...

http://search.cpan.org/search?mode=all&query=sort
dd

*10exp9 records.
Sta a me dire "non ho capito": vuoi riordinare i record in base al valore
di certi campi, o i campi all'interno di ogni record?
Nel primo caso, che mi sembra il piu' probabile, la cosa piu' semplice, con
un numero cosi' elevato di record, e' appoggiarsi a qualche motore di
database, che ti faccia lui l'ordinamento.
Non che non sia possibile implementare la cosa in perl, algoritmi
efficienti si possono senz'altro trovare (probabilmente un qualche tipo di
split sort), ma non sono sicuro che valga la pena perderci del tempo: il
modo ragionevole per gestire una massa di dati di quella proporzione e'
usare un database, sicche' tanto vale fargli fare anche il lavoro di
ordinamento.
Ciao.

database, che ti faccia lui l'ordinamento.
Ho scordato un pezzo: nel secondo caso, cioe' che tu debba fare qualche
trasformazione su ogni record, spiega meglio qual e' la struttura del
record iniziale e qual e' quella a cui vuoi arrivare, perche' io non ho
capito.
Ciao.

 ordinamento.
Guardati la synopsis di questo modulo, e vedrai che anche un pigrone potrà
scrivere 3 o 4 righe di code per ottenere quello che vuole, oltretutto
potendo decidere anche il chunk di dati che il programma usa alla volta
(credo che centinaia di mega inchiodino facilmente un server :-))
http://search.cpan.org/author/CNANDOR/File-Sort-1.01/Sort.pm
ciao
dd

 Non so come implementare
Il suggerimento di Raffello è valido se la quantità di dati che devi
caricare è sufficientemente piccola da essere gestibile in memoria.
Dato l'elevato numero di record, nel tuo caso, un possibile approccio
potrebbe essere questo:
1) Carica quanti più dati puoi, ordinali e salva il risultato in un file.
Ovviamente, se devi ordinare in base a una *porzione* del record, non ha
senso tenere in memoria l'intero record, basta prendere la porzione che ti
interessa e combinarla con un riferimento alla posizione del record nel
file originario.
2) Procedi ripetendo (1) finchè non esaurisci i record del file
originario.
3) [merge] Leggi parallelamente i record uno alla volta da tutti i file
generati e assemblali in modo che l'ordinamento finale sia quello voluto.
Se i file contenevano i record completi avrai già completato il lavoro,
diversamente dovrai usare i riferimenti alle posizioni per recuperare i
record originari dal file originario.
Probabilmente esiste qualche modulo che già fa questo lavoro. Cerca su
CPAN.
Altro approccio:
1) Crea un file DB_BTREE che consenta duplicati delle chiavi, e per ogni
record del file originario inserisci una coppia che abbia come chiave la
*porzione* di record su cui devi ordinare e come valore un riferimento
alla posizione del record nel file. In sostanza, stai *indicizzando* il
file.
2) Giacchè l'ordine di recupero delle chiavi segue i criteri di
ordinamento specificati, ti basta scorrere le chiavi del file DB e per
ogni elemento ricavare il record originario.
Max

scrivere 3 o 4 righe di code per ottenere quello che vuole
Si`, si`, ma che cosa te ne fai di duemiliardicinquecentomilioni di record
in formato testo, una volta anche che li hai ben ordinati?
S'intende che nel caso specifico ci potrebbero essere ottimi motivi per
tenerli cosi`; in generale, pero`, se i dati non devono giusto star li` e
basta, ma essere anche consultati, io mi affretterei a cercare un database,
e uno buono anche. E una macchina grossa e veloce da poter dedicare
interamente a questo.
Comunque, rileggendo i messaggi, mi e` venuto il sospetto che debba invece
trasformare in qualche modo ogni singolo record.
Ciao.

 ha scritto nel messaggio
news:lu7cousakodf0do80...@4ax.com...


 formato di datazione, indistintamente.
E come fai a discriminare una data US da una EU? 02/01/02 puo' essere 
il 2 gennaio o il primo febbraio e non hai modo di distinguerle a meno 
di non sapere, per altre vie, in che formato la data e' registrata.
-- 
Saluti,
Giancarlo

 ha scritto nel messaggio
news:am6sc9$60ki$1...@stargate1.inet.it...


 Chiedo aiuto a chi ne sà più di me.
Per me e' impossibile e non hai uscita. Forse hai qualche speranza se i 
record sono gia' in ordine cronologico, ma anche in questo caso 
dovresti assumere delle condizioni che non puo' verificare e che non 
puoi sapere se vengono soddisfatte sempre.
se hai la seguenza (ometto l'anno):
01/01
02/01
03/02
anche sapendo che sono in ordine cronologico potrebbero essere:
1 gen, 2 gen, 3 feb
oppure
1 gen, 1 feb, 3 feb
oppure
1 gen, 2 gen, 2 mar
oppure
1 gen, 1 feb, 2 mar
tutte le 4 serie sono corrette.
Non riseco a pensare un algoritmo (anche senza pensare "in perl", ma 
usando solo la logica) che ti permetta di risolvere questo problema in 
modo sicuro e certo al 100%.
-- 
Saluti,
Giancarlo

registrati sequenzialmente, magari separati da un simbolo convenzionale ?
Non ho la piu' pallida idea di che cosa sia un "file dat", ne' tantomeno di
che cosa voglia dire "incolonnare" o "impilare" dei record (e, insisto,
50x2.500.000.000 fa, se non sbaglio, 125.000.000.000, non 309.000.000).
Ciao.

 ha scritto nel messaggio
news:3rtdou840q3rfjmtc...@4ax.com...


 L'operazione va compiuta una tantum.
Quale operazione?
-- 
Saluti,
Giancarlo

L'operazione va compiuta una tantum.
D'accordo, ma e` su OGNI record o su TUTTI i record?: devi ordinare tutti i
record fra di loro o, in ogni record, riorganizzare e riscrivere i campi?
Ciao.

 ha scritto nel messaggio
news:f7Dh9.119321$pX1.4...@news2.tin.it...



Ho seguito il thread ed effettivamente non sei stato prodigo di particolari
nell'illustrare il tuo problema! Grosso modo hai:
- per input: un grosso file (di testo) di partenza.
- per output: un insieme logico di record ordinati per il campo data.
La soluzione migliore è strutturare i dati che, a quanto ho capito e
contrariamente al subject non sono un hash (cioè coppie key/value),
ma record contenenti più campi.
Devi progettare prima uno schema che relazioni le varie entità
in gioco e probabilmente l'adozione di un database relazionale ti
risparmierà un po' di tempo e sudore... :-)
Dal punto di vista procedurale dovrai fare una utility di alimentazione
del database sul quale poi effettivamente potrai fare ciò che chiedi.
Ad occhio e croce poi penso che normalizzando i dati a tua disposizione
tu possa ridurre notevolmente le dimensioni in termini di spazio.
   - Enrico