User:Michael Bednarek/WTROC
This tool allows the re-ordering (and dropping) of columns of Wikipedia tables (WTROC=Wikipedia Tables Reorder Columns). It requires the Microsoft Windows Script Host.
Instructions
[edit]Save the code below into a file and name it WTROC.WSF.
Save the Wikipedia table code you want to process into a file named as you wish. Add a new first line to that file which contains the original column numbers in the new order; columns can be dropped by using 0 (zero) as their new column designator; new columns can be inserted by entering a text string insted of the column number.
Invoke the program with WScript //Nologo WTROC.wsf "file.txt" >"output.txt".
The Wikipedia table code must specify each row in a single record. See the program code for an example.
The program performs no error checking; it is not comprehensively tested but it works for me. Report errors on this page's Talk page. Use at your own risk. Note especially that no check is performed whether the redirected output file already exists and whether you really want to overwrite it. I am unlikely to develop this any further, e.g. dealing with more freely formatted Wikipedia table code where line breaks are used to separate columns.
Source code
[edit]<job id="WTROC">
<runtime>
<description>
WTROC V1.20 Dec-2008 Michael Bednarek mailto:rot13(zo@zorqanerx.pbz)
"Re-order columns in Wikipedia tables"
</description>
<unnamed
name = "File"
helpstring = "File with Wikipedia table code to process where the first line contains the source column numbers; a string for new columns."
many = "False"
required = "1"
/>
<example>
Example: WScript //Nologo WTROC.wsf "file.txt"
"Note: //Nologo is recommended because output is written to stdout"
"To redirect output to a file:"
Example: WScript //Nologo WTROC.wsf "file.txt" >"output.txt"
</example>
</runtime>
<script language="VBScript">
Option Explicit
' Arguments:
' 1: File to be processed
' First line contains the source column numbers (list of comma separated numbers) or a string for a new column
' Rest of the file is the Wikipedia table code where each row is contained in one record.
' Example:
' 2,3,4,5,NewCol-5,1,6,8
' {| class="wikitable sortable"
' !p1=x1|C1->C6!!p2=x2|C2->C1!!p3=x3|C3->C2!!p4=x4|C4->C3!!p5=x5|C5->C4!!p6=x6|C6->C7!!C7-drop!!C8->C8
' |-
' |R1C1||R1C2||R1C3||R1C4||R1C5||R1C6||R1C7||R1C8
' |-
' |R2C1||R2C2||R2C3||R2C4||R2C5||R2C6||R2C7||R2C8
' …
' would reorder a table from C1->C6, C2->C1, C3->C2, C4->C3, C5->C4, C6->C7, C7-drop, C8->C8
' to C2->C1, C3->C2, C4->C3, C5->C4, NewCol-5, C1->C6, C6->C7, C8->C8
' inserting a new column 5, moving column 1 to 6, 6 to 7, dropping column 7, keeping column 8 in that position.
' Version history:
' 1.00 Dec-2008 Original version
' 1.10 Jan-2009 Allow dropping columns by using "0" for the target column number.
' 1.20 Jan-2009 Allow inserting columns by using text for the target column "number";
' this required a logig change for the numbers in the first record:
' they now indicate the originating position; columns can be dropped by simply not mentioning them.
' To do: Error checking, especially consistency between the number of columns specified in the first
' record versus the number of columns found in each record.
' Also: consistency of the first record: no duplicates, no numbers outside the number of terms.
Dim objArgs ' As WshArguments
Dim objStream ' As TextStream
Dim StdOut ' As Object ' of StandardStreamTypes
Dim strLine ' As String ' original line from file
Dim strOrder ' As Variant ' Array, target column numbers, incl. 0 for dropped columns, a string for new columns
Dim strIn ' As Variant ' Array of columns
Dim strL2 ' As String * 2 ' First two characters
Dim strOut2 ' As String ' Final output
Dim strSep ' As String * 1 ' Separator (! or |)
Dim lngColsOut ' As Long ' Number of terms in the 1st record = columns in output records
Dim i ' As Long ' Loop through columns
Const ForReading = 1
Const TristateUseDefault = -2
Const blnDebug = 0
Set objArgs = WScript.Arguments.Unnamed ' Obtain command line arguments
If objArgs.Count <> 1 Then ' Must have exactly one command line argument
WScript.Arguments.ShowUsage
WScript.Quit(8)
Else
Set StdOut = WScript.StdOut
Set objStream = WScript.CreateObject("Scripting.FileSystemObject").OpenTextFile(objArgs.Item(0), ForReading, vbFalse, TristateUseDefault)
strLine = objStream.ReadLine ' First record, containing new column numbers
strOrder = Split(strLine, ",") ' Split target column numbers into array
lngColsOut = UBound(strOrder) ' Number of terms in the 1st record
If blnDebug Then StdOut.WriteLine "Debug: lngColsOut= " & lngColsOut & " from " & strLine
ReDim strOut(lngColsOut) ' As String ' Intermediate, arrayed output
Do While Not objStream.AtEndOfStream
strLine = objStream.ReadLine
If blnDebug Then StdOut.WriteLine "Debug: " & strLine
strL2 = Left(strLine, 2) ' First 2 characters
If strL2 = "{|" Or strL2 = "|-" Or strL2 = "|}" Then ' Start of table or new row or end of table
strOut2 = strLine ' Copy straight to output
Else
strSep = Left(strLine, 1) ' First character is the array separator
strIn = Split(strLine, strSep & strSep) ' Split columns into array
For i = 0 To lngColsOut ' Loop through the columns
If IsNumeric(strOrder(i)) Then
If strOrder(i) = 1 Then ' Special treatment for first column
strOut(i) = Mid(strIn(strOrder(i) - 1), 2) ' Drop 1st character in first field ("|" or "!") and reorder
Else
strOut(i) = strIn(strOrder(i) - 1) ' Reorder this column to its target column
End If
Else ' IsNumeric(strOrder(i) ' Insert a column
If strSep = "!" Then
strOut(i) = strOrder(i) ' Insert text string into header row
Else
strOut(i) = " " ' Insert blank column into table row
End If
End If ' IsNumeric(strOrder(i)
Next ' i (column)
strOut2 = strSep & Join(strOut, strSep & strSep) ' Construct output string (prepend the 1st character dropped above)
End If
StdOut.WriteLine strOut2 ' Output string to stdout
Loop
objStream.Close
StdOut.Close
Set objStream = Nothing
Set StdOut = Nothing
End If
Set objArgs = Nothing
WScript.Quit(0)
</script>
</job>
Licence
[edit]This work has been (or is hereby) released into the public domain by its creator, Michael Bednarek. This applies worldwide. In case this is not legally possible, the creator grants anyone the right to use this work for any purpose, without any conditions, unless such conditions are required by law. |
See also
[edit]- VBA Macro for EXCEL tableconversion (instructions in English)
- VBA Macro source code for the above
- WTDtHs, tool to insert template {{Hs}} into table columns which contain dates