Question

Does anyone have a short script in VBscript for transposing a Matrix (given as CSV (comma separated values) file)?

A, 1, 2, 3
B, 7, 5, 6

->

A, B
1, 7
2, 5
3, 6

Many Thanks in advance Tom

Was it helpful?

Solution

So by creating dynamic arrays and auto-increment their growth in parallel with discovering new columns of the original matrix, you can auto build the new data structure quite quickly.

Matrix Transposer

Const OutputCSV = "C:\op.csv"
Dim dt_start, WriteOutput : dt_start = Now
Dim fso : Set fso = CreateObject("Scripting.FileSystemObject")
Dim file : Set file = fso.OpenTextFile("C:\test.csv", 1, True)
Set WriteOutput = fso.OpenTextFile(OutputCSV, 8, True)
Dim fc : fc = file.ReadAll : file.close : Dim fcArray : fcArray = Split(fc, vbCrLf)
WScript.echo "Before Transpose"
WScript.echo "----------------"
WScript.echo fc
WScript.echo "----------------"
Dim opArray() : ReDim opArray(0)
For Each row In fcArray
    Dim tmp: tmp = Split(row, ",")
    For ent=0 To UBound(tmp)
        If ent  > UBound(opArray) Then
            ReDim Preserve opArray(UBound(opArray)+1)
            opArray(ent) = Trim(tmp(ent))
        Else
            If Len(opArray(ent)) > 0 Then
                opArray(ent) = opArray(ent) & "," & Trim(tmp(ent))
            Else
                opArray(ent) = Trim(tmp(ent))
            End If
        End If
    Next
Next
Dim dt_end : dt_end = Now
WScript.echo "After Transpose"
WScript.echo "----------------"
WScript.echo Join(opArray, vbCrLf)
WScript.echo "----------------"
WScript.echo "Script Execution Time (sec): " & DateDiff("s", dt_start, dt_end)
WriteOutput.Write Join(opArray, vbCrLf) : WriteOutput.Close

OTHER TIPS

If it's just two lines with an equal number of values, you can read both into arrays using the Split function:

a1 = Split(FileIn.ReadLine, ",")
a2 = Split(FileIn.ReadLine, ",")

Then, iterate the arrays and write each element:

For i = 0 To UBound(a1)
    FileOut.WriteLine a1(i) & ", " & a2(i)
Next

I'm assuming you know how to open files for reading and writing?

Edit: It sounds like you may have an unknown number of rows to read. In that case, you can use an array of arrays:

Dim a(255) ' Hold up to 255 rows. Adjust as needed. Or use ReDim Preserve to grow dynamically.
Do Until FileIn.AtEndOfStream
    a(i) = Split(FileIn.ReadLine, ",")
    i = i + 1
Loop

Then, to write:

For j = 0 To UBound(a(0))

    ' Concatenate the elements into a single string...
    s = ""
    For k = 0 To i - 1
        s = s & a(k)(j) & ","
    Next

    ' Write the string without the final comma...        
    FileOut.WriteLine Left(s, Len(s) - 1)

Next
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top