質問
これは非常に簡単な質問です-コレクションをソートするにはどうすればよいですか
ランダムな順序で行を含むCSVファイルがあります。 1つの列の日付に従って行を並べ替えたいのですが。行をレコードセットに追加しますか? Scripting.Dictionaryで並べ替えることはできますか?
.NETとLinqに明らかに甘やかされており、今では古典的なaspの土地に戻っています。完全なn00bのように感じます。
解決
この場合、私は兄貴.netから助けを得るでしょう。 ASPアプリ内で System.Collections.Sortedlist を使用して、キーと値のペアを並べ替えることができます。
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
次の.netクラスも利用できる場合:
- System.Collections.Queue
- System.Collections.Stack
- System.Collections.ArrayList
- System.Collections.SortedList
- System.Collections.Hashtable
- System.IO.StringWriter
- System.IO.MemoryStream;
も参照してください: COMの驚異。 NET相互運用
他のヒント
RecordSetアプローチを使用します。テキストドライバーを使用します。接続文字列のディレクトリとselectステートメントのファイル名を変更する必要があります。拡張プロパティ" HDR = Yes"疑似SQLの記述を容易にするため、CSVにヘッダー行があることを指定します。
<%
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
%>
私にとっても久しぶりです。 IIRCにはオプションがありません。
私があなただったら、すべてのデータを配列に入れてから、配列をソートします。ここでQuickSortの実装を見つけました: http://www.4guysfromrolla.com/webtech/012799 -3.shtml
「バブルソート」もご覧ください。これらの古典的なaspタグクラウドで優れた動作をします。
これに対する遅い遅い答えですが、まだ価値があります。
小さなコレクションで作業していたので、毎回正しい場所にアイテムを挿入し、追加するたびにコレクションを効果的に再構築するアプローチができました。
VBScriptクラスは次のとおりです。
'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