spesso ci capita di dover ordinare liste di dati secondo criteri ben precisi...
per dare una mano a SMILE21 ho scritto un po' di codice, e mi sembra stupido che rimanga nei nostri PM e basta
smile21 ha un cartella con dei file che si chiamano
l'ordinamento era fatto secondo il FSO, e quindi in ordine alfabetico, e quindi ordinava come sopra...codice:03_03_05Indoor_Club_final_rankings.pdf 04_10_04outdoor_club_venues,_dates_2005.pdf 05_10_04ExecmeetingSofia.pdf 07_03_05Change_EHF_Outdoor_Regulations.pdf 08_02_05_Nations_Championships_2005_-_WC_Qualifications.pdf 08_10_04Indoor_Nations_2006.pdf 09_02_05ExecmeetingZagreb.pdf 09_02_05Indoor_Hockey_Junior_Women_Championship_and_Trophy.pdf 09_12_04ProtocolAgreementwithAfrica2004.pdf
a smile21 serviva fossero ordinati per la data indicata a inizio file...
ecco lo script che lo fa...
ci sono due conoscenze applicate...codice:<% 'inizializzo le REGEXP (regular expression... ci serviranno per controllare se il file 'inizia, nel nome, con una data) Dim Reg, tmp_elencofile, arr_file Set Reg = New Regexp Reg.IgnoreCase = True Reg.Global = True Reg.Pattern = "^\d\d[_]\d\d[_]\d\d" 'ovvero ^ = all'inizio '\d = numero (una cifra) '[_] = carattere "_" Set file1 = CreateObject("Scripting.FileSystemObject") Set file2 = file1.GetFolder(server.mappath("/bulletin/")) Set file3 = file2.Files 'inizializza l'elenco dei file tmp_elencofile = "" For Each file in file3 if Reg.test(file.name) then 'se il file inizia con una data 'lo aggiunge all'elenco dei file, dividendo le stringhe dei nomi con il carattere "$" tmp_elencofile = tmp_elencofile & file.name & "$" end if Next 'suddivide la stringa dell'elenco diviso da $ dei file in un array arr_file = split(tmp_elencofile,"$") '---ORDINO L'ARRAY------ ' l'ordinamento dell'array è fatto in base alla data indicata a inizio del nome del file dim ordflag, ordtmp, ordi ordflag = true do while ordflag ordflag = false for ordi = LBound(arr_file) to UBound(arr_file)-1 if not trim(arr_file(ordi+1)) = "" then if cdate(replace(mid(arr_file(ordi),1,8),"_","/")) > cdate(replace(mid(arr_file(ordi+1),1,8),"_","/")) then ordtmp = arr_file(ordi) arr_file(ordi) = arr_file(ordi+1) arr_file(ordi+1) = ordtmp ordflag = true end if end if next loop '---FINE ORDINO L'ARRAY------ 'stampa a schermo l'array ordinato nella maniera che serve for i=0 to Ubound(arr_file)-1 response.write arr_file(i) & " " next %>
la prima è REGULAR EXPRESSION
e la seconda (che non è una conoscenza, ma un algoritmo) è l'ordinamento dell'ARRAY
per le REGEXP (ne ho parlato spesso) esiste un mondo, quindi se non le conoscete studiatele, perchè davvero con le stringhe vengono molto utili (e io con WBSTAT http://www.imente.it/wbstat ci ho fatto un gran callo)
la parte VERDE è il PATTERN, ovvero ciò che deve cercare nella stringa...
il TEST è l'esecuzione della ricerca (TRUE se lo trova, FALSE se non lo trova)
per l'ordinamento invece... è un algoritmo RIUTILIZZABILE (ed è il motivo per cui ho fatto questo 3D)...
al posto della parte in ROSSO è possibile mettere qualsiasi condizione sulla stringa (in questo caso estrapola i primi 8 caratteri "00_00_00", scambia la "_" con una "/" "00/00/00", e trasforma il risultato in una data per fare il confronto"00/00/0000 00.00.00")
se usate ad esempio
ordinerà l'array in ordine ALFABETICOcodice:'---ORDINO L'ARRAY------ ' l'ordinamento dell'array è fatto alfanumericamente dim ordflag, ordtmp, ordi ordflag = true do while ordflag ordflag = false for ordi = LBound(arr_file) to UBound(arr_file)-1 if not trim(arr_file(ordi+1)) = "" then if lcase(arr(ordi))>lcase(arr(ordi+1)) then ordtmp = arr_file(ordi) arr_file(ordi) = arr_file(ordi+1) arr_file(ordi+1) = ordtmp ordflag = true end if end if next loop '---FINE ORDINO L'ARRAY------
basta dare un array che si chiama ARR_FILE prima di questo codice qui sopra..
e il risultato sarà ordinato
---
sperando che possa essere utile ad altri
saluti a tutti
(e scusate per la pessima scrittura di stasera...
sono un po' flippatino)
se avete domande o richieste per altri tipi di applicazioni son qui
ciao



Rispondi quotando