Как преобразовать 1 столбец Datatable в Datatable с несколькими столбцами, используя FixedWidth - PullRequest
0 голосов
/ 15 января 2020

Я работаю с робототехнической программой BluePrism для автоматизации чтения, интерпретации и, в конечном счете, работы в приложении для мэйнфреймов. Приложение для мэйнфреймов устарело, и его файлы сеансов несовместимы с BluePrism. Если бы это было так, я бы не пытался показать то, что собираюсь вам показать / спросить.

Поскольку мы не можем использовать встроенное чтение экрана в BluePrism, почему бы не сделать так, чтобы робот копировал весь экран как текст? Я думал, что здесь очень хорошо будет работать с текстом.

В любом случае у меня есть робот, копирующий экран, и я могу получить экран из буфера обмена. Нет проблем. У меня даже есть экран в DataTable (BluePrism называет их Коллекциями, но одними и теми же объектами), где каждая строка является строкой на экране. Круто.

Что ж, вот вопрос с кодом, который я пытался сделать, но не смог. Я хочу разделить каждую строку в этой DataTable, используя TextFieldParser и FixedWidth, поскольку я не могу использовать разделители символов или пробелы. А затем добавьте эту разделенную строку в новый выходной DataTable. Так что я могу использовать его позже в BluePrism. Код ниже компилируется. Я не ловлю ошибки. Я не получаю необработанные тоже. Что я получаю, так это пустой выходной объект DataTable, но он содержит правильное количество строк. Итак, ошибка логики c, но я буду проклят, если увижу, что я сделал неправильно.

Dim colFields(6) As String
Dim line As String
line = ""

Try
    For Each row As System.Data.DataRow In ScrnSectColl.Rows
        line = row("Value")
        Using stringline As New System.IO.StringReader(line)
            Using reader As New Microsoft.VisualBasic.FileIO.TextFieldParser(stringline)
                reader.TrimWhiteSpace = False
                reader.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.FixedWidth
                reader.SetFieldWidths(17, 9, 9, 17, 10, 10, 8)
                colFields = reader.ReadFields()
                Dim R As DataRow = SplitScrnSectColl.NewRow()
                For i As Integer = 0 To SplitScrnSectColl.Columns.Count - 1
                    R.Item(i) = colFields(i)
                Next
                SplitScrnSectColl.Rows.Add(R)
            End Using
        End Using
    Next row
Catch ex As Exception
    TextParserFailed = True
    'SplitScrnSectColl.Clear()
    ErrorMessage = "Error: Text Field Parser failed " & System.Environment.NewLine & line & System.Environment.NewLine & "Original Error: " & ex.Message
End Try

Я знаю, что TextFieldParser работает, потому что я могу вывести строковый массив colFields в текстовый файл и Я получаю часть экрана, которую я только что скопировал. Таким образом, шаг внутри для l oop R.Item(i) = colFields(i) не работает должным образом или не работает add SplitScrnSectColl.Rows.Add(R). Никаких ошибок, хотя. Просто пустой DataTable. Мы будем благодарны за любую помощь.

ScrnSectColl - это входная таблица данных, которая состоит из строк текста на экране. SplitScrnSectColl - это выходная таблица данных из 7 столбцов всего текста.

1 Ответ

0 голосов
/ 15 января 2020
Dim workTable As New DataTable
workTable.Columns.Add("InvNum", GetType(String))
workTable.Columns.Add("BatchNum", GetType(String))
workTable.Columns.Add("InvDate", GetType(String))
workTable.Columns.Add("PO_Num", GetType(String))
workTable.Columns.Add("InvTot", GetType(String))
workTable.Columns.Add("OpenAmt", GetType(String))
workTable.Columns.Add("PayDate", GetType(String))

Dim colFields(6) As String
Dim line As String
line = ""

Try
    For Each row As System.Data.DataRow In ScrnSectColl.Rows
        line = row("Value")
        Using stringline As New System.IO.StringReader(line)
            Using reader As New Microsoft.VisualBasic.FileIO.TextFieldParser(stringline)
                reader.TrimWhiteSpace = False
                reader.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.FixedWidth
                reader.SetFieldWidths(17, 9, 9, 17, 10, 10, 8)
                colFields = reader.ReadFields()
                Dim R As DataRow = workTable.NewRow()
                For i As Integer = 0 To workTable.Columns.Count - 1
                    R.Item(i) = colFields(i)
                Next
                workTable.Rows.Add(R)
            End Using
        End Using
    Next row
    SplitScrnSectColl = workTable
Catch ex As Exception
    TextParserFailed = True
    'SplitScrnSectColl.Clear()
    ErrorMessage = "Error: Text Field Parser failed " & System.Environment.NewLine & line & System.Environment.NewLine & "Original Error: " & ex.Message
End Try

Я определил временную рабочую таблицу, а затем присвоил ее выходной таблице данных SplitScrnSectColl. Оно работает! Спасибо.

...