Skip to content

Commit 3e3d15a

Browse files
committed
Added SortByField method. Fixed RearrangeFields method bug.
1 parent 7778906 commit 3e3d15a

File tree

1 file changed

+60
-1
lines changed

1 file changed

+60
-1
lines changed

src/CSVinterface.cls

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2843,6 +2843,7 @@ ParseCSVstring_NoSignificantData:
28432843
Resume ParseCSVstring_Error_Handler
28442844
End Sub
28452845
Public Function RearrangeFields(FieldsOrder As String) As CSVinterface
2846+
On Error GoTo ErrHandler_RearrangeFields
28462847
If P_SUCCESSFUL_IMPORT And Not P_VARYING_LENGTHS Then
28472848
Dim tmpFldOrder() As String
28482849
Dim cpRecord() As Variant
@@ -2865,7 +2866,7 @@ Public Function RearrangeFields(FieldsOrder As String) As CSVinterface
28652866
tmpRecord() = .item(rCounter)
28662867
iRecCnt = 0
28672868
For fCounter = LBound(tmpFldOrder) To UBound(tmpFldOrder)
2868-
cpRecord(iRecCnt) = tmpRecord(CDbl(tmpFldOrder(fCounter)))
2869+
cpRecord(CDbl(tmpFldOrder(iRecCnt))) = tmpRecord(fCounter)
28692870
iRecCnt = iRecCnt + 1
28702871
Next fCounter
28712872
.item(rCounter) = cpRecord
@@ -3403,6 +3404,64 @@ Sort_Error_Handler:
34033404
P_ERROR_DESC = "[Sort] " & Err.Description
34043405
P_ERROR_SOURCE = Err.Source
34053406
End Function
3407+
Public Function SortByField(Optional ByVal FromIndex As Long = -1, _
3408+
Optional ByVal ToIndex As Long = -1, _
3409+
Optional ByVal SortingKey As Long = 1, _
3410+
Optional ByVal SortAlgorithm As SortingAlgorithms = SortingAlgorithms.SA_IntroSort) As CSVinterface
3411+
3412+
On Error GoTo SortByField_Error_Handler:
3413+
3414+
If P_SUCCESSFUL_IMPORT Then
3415+
If FromIndex = -1 Then
3416+
FromIndex = 1
3417+
End If
3418+
Dim CurField As CSVArrayList
3419+
Dim CurFieldArray() As Variant
3420+
Dim sfIcounter As Long
3421+
3422+
Set CurField = New CSVArrayList
3423+
CurFieldArray() = P_CSV_DATA(Abs(SortingKey) - 1)
3424+
If ToIndex = -1 Then
3425+
ToIndex = UBound(CurFieldArray) + 1
3426+
End If
3427+
For sfIcounter = LBound(CurFieldArray) To UBound(CurFieldArray)
3428+
CurField.Add2 CurFieldArray(sfIcounter)
3429+
Next sfIcounter
3430+
CurField.ShrinkBuffer
3431+
CurField.Sort FromIndex, ToIndex, Sgn(SortingKey) * 1, SortAlgorithm
3432+
RearrangeFields SortRearrangeGetStr(CurFieldArray, CurField)
3433+
Set SortByField = Me
3434+
End If
3435+
Exit Function
3436+
SortByField_Error_Handler:
3437+
P_ERROR_NUMBER = Err.Number
3438+
P_ERROR_DESC = "[SortByField] " & Err.Description
3439+
P_ERROR_SOURCE = Err.Source
3440+
End Function
3441+
Private Function SortRearrangeGetStr(FieldArray() As Variant, SortedFieldList As CSVArrayList) As String
3442+
Dim srgIcounter As Long
3443+
Dim srgJcounter As Long
3444+
Dim srgTmpBool As Boolean
3445+
Dim tmpData() As Variant
3446+
Dim fldPos As Long
3447+
Dim tmpResult As CSVArrayList
3448+
3449+
tmpData() = SortedFieldList.items
3450+
Set tmpResult = New CSVArrayList
3451+
For srgIcounter = LBound(FieldArray) To UBound(FieldArray)
3452+
srgJcounter = LBound(tmpData)
3453+
fldPos = 0
3454+
Do
3455+
srgTmpBool = (tmpData(srgJcounter)(0) = FieldArray(srgIcounter))
3456+
If Not srgTmpBool Then
3457+
fldPos = fldPos + 1
3458+
End If
3459+
srgJcounter = srgJcounter + 1
3460+
Loop While Not srgTmpBool And srgJcounter <= UBound(tmpData)
3461+
tmpResult.Add fldPos
3462+
Next srgIcounter
3463+
SortRearrangeGetStr = Join$(tmpResult.items, ",")
3464+
End Function
34063465
Public Function SplitField(aIndex As Long, CharToSplitWith As String) As CSVinterface
34073466
On Error GoTo ErrHandler_SplitField
34083467
If P_SUCCESSFUL_IMPORT And Not P_VARYING_LENGTHS Then

0 commit comments

Comments
 (0)