1

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

2 Answers 2

1

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
Sign up to request clarification or add additional context in comments.

Comments

1

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

1 Comment

no sorry, the Matrix could be arbitrarily large. Nevertheless thanks for you help.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.