User:Michael Bednarek/WTROC

From Wikipedia, the free encyclopedia
WTROC is a console application

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) = "&nbsp;"          ' 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]

See also[edit]