Pregunta

Es una pregunta bastante simple: ¿cómo clasifico una colección?

Tengo un archivo CSV con filas en un orden aleatorio. Me gustaría ordenar las filas según la fecha en una columna. ¿Agrego las filas a un conjunto de registros? ¿Puedo ordenar con un Scripting.Dictionary?

Claramente he sido mimado con .NET y Linq, y ahora me encuentro de nuevo en la tierra del asp clásico, al darme cuenta de que debí haberlo sabido hace 7 años, y que faltan muchísimo los genéricos. Me siento como un completo n00b.

¿Fue útil?

Solución

En este caso, obtendría ayuda de mi hermano mayor .net. Es posible usar System.Collections.Sortedlist dentro de su aplicación ASP y ordenar sus pares de valores clave.

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

Por supuesto, si las siguientes clases .net también están disponibles:

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

También vea: Marvels of COM. Interoperabilidad NETO

Otros consejos

Me gustaría ir con el enfoque RecordSet. Use el controlador de texto. Deberá cambiar el directorio en la cadena de conexión y el nombre de archivo en la instrucción select. la propiedad extendida " HDR = Sí " especifica que hay una fila de encabezado en el CSV que sugiero ya que facilitará la escritura del 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

%>

También ha pasado mucho tiempo para mí. IIRC no tiene una opción fuera de la caja.

Si fuera usted, pondría todos los datos en una matriz y luego ordenaría la matriz. Encontré una implementación de QuickSort aquí: http://www.4guysfromrolla.com/webtech/012799 -3.shtml

Observe también el " Bubble Sort " ;, funciona excelente con esos clásicos nube de etiquetas asp.

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

Una respuesta tardía a esto, pero sigue siendo valiosa.

Estaba trabajando con pequeñas colecciones para poder permitirme el enfoque en el que insertaba el elemento en el lugar correcto en cada ocasión, reconstruyendo efectivamente la colección en cada adición.

La clase de VBScript es la siguiente:

'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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top