Frage

Es ist eine ganz einfache Frage - wie sortiere ich eine Sammlung

Ich habe eine CSV mit Zeilen in einer zufälligen Reihenfolge Datei einsehen. Ich mag die Zeilen nach dem Datum in einer Spalte sortieren. Muss ich die Zeilen zu einem Re-Cord hinzufügen? Kann ich mit einem Scripting.Dictionary sortieren?

Ich habe mit .NET und Linq klar war verdorben, und jetzt finde ich mich zurück in das Land der klassischen Asp, zu realisieren, die ich vor über 7 Jahren kennen müssen, und Generika enorm fehlen. Ich fühle mich wie ein komplettes n00b.

War es hilfreich?

Lösung

In diesem Fall würde ich Hilfe von großen Bruder .net erhalten. Es ist möglich, zu verwenden System.Collections.SortedList in Ihrem ASP-App und erhalten Sie Ihre Schlüssel-Wert-Paare sortiert.

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

Btw, wenn die folgenden .net Klassen zur Verfügung stehen auch:

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

Siehe auch: Marvels von COM. NET Interop

Andere Tipps

würde ich mit dem RecordSet Ansatz gehen. Verwenden Sie den Text Driver. Sie finden das Verzeichnis in der Verbindungszeichenfolge und die Dateinamen in der select-Anweisung ändern müssen. die erweiterte Eigenschaft „HDR = Yes“ gibt an, dass es in der CSV eine Kopfzeile ist, die ich vorschlagen, wie es den psuedo Schreiben SQL erleichtern.

<%

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

%>

Es war auch für mich eine lange Zeit. IIRC Sie keine Möglichkeit haben, aus dem Kasten heraus.

Wenn ich Sie wäre, würde ich alle Daten in einem Array gesetzt und dann das Array sortieren. Ich fand eine QuickSort Implementierung hier: http://www.4guysfromrolla.com/webtech/012799 -3.shtml

Achten Sie auch auf dem "Bubble Sort", arbeitet ausgezeichnet mit dieser klassischen Asp Tag-Wolke.

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

Für späte späte Antwort auf diese Frage, aber immer noch von Wert.

Ich habe die Arbeit mit kleinen Sammlungen so könnte den Ansatz leisten, wo ich den Artikel in der richtigen Stelle bei jeder Gelegenheit eingesetzt wird, effektiv auf jeder Zugabe die Sammlung zu rekonstruieren.

Die VBScript-Klasse ist wie folgt:

'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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top