Domanda

È una domanda abbastanza semplice: come faccio a ordinare una raccolta?

Ho un file CSV con righe in ordine casuale. Vorrei ordinare le righe in base alla data in una colonna. Devo aggiungere le righe a un recordset? Posso ordinare con uno Scripting.Dictionary?

Sono stato chiaramente viziato con .NET e Linq, e ora mi ritrovo nella terra della classica asp, rendendomi conto che devo averlo saputo 7 anni fa e che ho perso immensamente i generici. Mi sento come un completo n00b.

È stato utile?

Soluzione

In questo caso otterrei aiuto dal fratello maggiore .net. È possibile utilizzare System.Collections.Sortedlist all'interno dell'app ASP e ottenere le coppie di valori-chiave ordinate.

set list = server.createObject("System.Collections.Sortedlist")
with list
  .add "something", "YY"
  .add "something else", "XX"
end with

for i = 0 to list.count - 1
    response.write(list.getKey(i) & " = " & list.getByIndex(i))
next

A proposito se sono disponibili anche le seguenti classi .net:

  • System.Collections.Queue
  • System.Collections.Stack
  • System.Collections.ArrayList
  • System.Collections.SortedList
  • System.Collections.Hashtable
  • System.IO.StringWriter
  • System.IO.MemoryStream;

Vedi anche: Marvels of COM. Interoperabilità NET

Altri suggerimenti

Vado con l'approccio RecordSet. Usa il driver di testo. Dovrai cambiare la directory nella stringa di connessione e il nome file nell'istruzione select. la proprietà estesa "HDR = Sì" specifica che esiste una riga di intestazione nel CSV che suggerisco in quanto renderà più semplice la scrittura di psuedo SQL.

<%

Dim strConnection, conn, rs, strSQL

strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\inetpub\wwwroot\;Extended Properties='text;HDR=Yes;FMT=Delimited';"

Set conn = Server.CreateObject("ADODB.Connection")
conn.Open strConnection

Set rs = Server.CreateObject("ADODB.recordset")
strSQL = "SELECT * FROM test.csv order by date desc"
rs.open strSQL, conn, 3,3

WHILE NOT rs.EOF
    Response.Write(rs("date") & "<br/>") 
    rs.MoveNext
WEND

rs.Close
Set rs = Nothing

conn.Close
Set conn = Nothing

%>

È passato molto tempo anche per me. IIRC non hai un'opzione pronta all'uso.

Se fossi in te metterei tutti i dati in un array e poi ordinerei l'array. Ho trovato un'implementazione di QuickSort qui: http://www.4guysfromrolla.com/webtech/012799 -3.shtml

Guarda anche " Bubble Sort " ;, funziona perfettamente con i classici cloud di tag asp.

http://www.4guysfromrolla.com/webtech/011001-1.shtml

Una risposta in ritardo a questo, ma comunque di valore.

Stavo lavorando con piccole collezioni, quindi potevo permettermi l'approccio in cui ho inserito l'oggetto nella posizione corretta in ogni occasione, ricostruendo efficacemente la collezione su ogni aggiunta.

La classe VBScript è la seguente:

'Simple collection manager class.
'Performs the opration of adding/setting a collection item.
'Encapulated off here in order to delegate responsibility away from the collection class.
Class clsCollectionManager
    Public Sub PopulateCollectionItem(collection, strKey, Value)
        If collection.Exists(strKey) Then
            If (VarType(Value) = vbObject) Then
                Set collection.Item(strKey) = Value
            Else
                collection.Item(strKey) = Value
            End If
        Else
            Call collection.Add(strKey, Value)
        End If
    End Sub

    'take a collection and a new element as input parameters, an spit out a brand new collection 
    'with the new item iserted into the correct location by order
    'This works on the assumption that the collection it is receiving is already ordered 
    '(which it should be if we always use this method to populate the item)

    'This mutates the passed collection, so we highlight this by marking it as byref 
    '(this is not strictly necessary as objects are passed by reference anyway)
    Public Sub AddCollectionItemInOrder(byref existingCollection, strNewKey, Value)
        Dim orderedCollection: Set orderedCollection = Server.CreateObject("Scripting.Dictionary")
        Dim strExistingKey

        'If there is something already in our recordset then we need to add it in order.

        'There is no sorting available for a collection (or an array) in VBScript. Therefore we have to do it ourself.
        'First, iterate over eveything in our current collection. We have to assume that it is itself sorted.
        For Each strExistingKey In existingCollection

            'if the new item doesn't exist AND it occurs after the current item, then add the new item in now 
            '(before adding in the current item.)
            If (Not orderedCollection.Exists(strNewKey)) And (strExistingKey > strNewKey) Then
                Call PopulateCollectionItem(orderedCollection, strNewKey, Value)
            End If
            Call PopulateCollectionItem(orderedCollection, strExistingKey, existingCollection.item(strExistingKey))
        Next

        'Finally check to see if it still doesn't exist. 
        'It won't if the last place for it is at the very end, or the original collection was empty
        If (Not orderedCollection.Exists(strNewKey)) Then
            Call PopulateCollectionItem(orderedCollection, strNewKey, Value)
        End If

        Set existingCollection = orderedCollection
    End Sub
End Class
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top