Как анализировать текстовый файл, разделенный знаком ~, в Datatable или массив в VB.Net - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь преобразовать текстовый файл в массив или таблицу данных, где строки, начинающиеся с D, O и L, представляют собой одну строку данных.

Строк не может быть больше 1 "L".

Я хочу получить это в массиве данных или в двумерном массиве, где имена заголовков столбцов (местоположения):

  • Дата {D3}
  • Имя клиента { O2}
  • Адрес {O3}
  • Город {O7}
  • Штат {O8}
  • Почтовый индекс {O9}
  • Код ссылки {D17}
  • Сумма {D20}

Я пробовал

TextFieldParser("C:\Users\MyAccount\test.txt")
FileReader.SetDelimiters("~")

Но я не понимаю, как работать с выводом. Есть идеи?

B~AAA~~12/03/19~12/03/19~1~428.51~APV~REF~K8~~
D~AAA~~12/03/19~12/03/19~APV~REF~N~REFUNDCIS~~12/03/19~0~N~N~Y~~~0000244909~~~72.90~~~00~N~0~12/03/19~0~12/03/19~12/03/19~0~K8~~~N~N~0~
O~JOHN DOE~ 1000 NOAKY LN   ~~~~DETROIT~MI~31000~~~
L~01~141011~000~00000~000~00~000~~REFUND0000244909JOHN DOE~72.90~N~N~~~N~
D~AAA~~12/03/19~12/03/19~APV~REF~N~REFUNDCIS~~12/03/19~0~N~N~Y~~~0000404236~~~101.42~~~00~N~0~12/03/19~0~12/03/19~12/03/19~0~K8~~~N~N~0~
O~BRUCE DOE~UNIT 1 1000 E MICHIGAN AVE   ~~~~DETROIT~MI~31000~~~
L~01~141011~000~00000~000~00~000~~REFUND0000404236BRUCE DOE~101.42~N~N~~~N~
D~AAA~~12/03/19~12/03/19~APV~REF~N~REFUNDCIS~~12/03/19~0~N~N~Y~~~0000436750~~~180.00~~~00~N~0~12/03/19~0~12/03/19~12/03/19~0~K8~~~N~N~0~
O~JOEL DOE~ 100 MICHIGAN AVE   ~~~~DETROIT~MI~31000~~~
L~01~141011~000~00000~000~00~000~~REFUND0000436750JOEL DOE~180.00~N~N~~~N~
D~AAA~~12/03/19~12/03/19~APV~REF~N~REFUNDCIS~~12/03/19~0~N~N~Y~~~0000448122~~~74.19~~~00~N~0~12/03/19~0~12/03/19~12/03/19~0~K8~~~N~N~0~
O~JOHN DOE~ 100 MICHIGAN AVE   ~~~~DETROIT~MI~31000~~~
L~01~141011~000~00000~000~00~000~~REFUND0000448122JOHN DOE~74.19~N~N~~~N~

1 Ответ

0 голосов
/ 09 мая 2020

Сначала я взял код из документов MS https://docs.microsoft.com/en-us/dotnet/api/microsoft.visualbasic.fileio.textfieldparser?view=netcore-3.1 Мне нужно было знать, сколько столбцов мне нужно в таблице данных.

Private Sub OpCode1()
    Dim maxColumnCount As Integer
    Using MyReader As New TextFieldParser("C:\Users\xxx\test.txt")
        MyReader.TextFieldType = FieldType.Delimited
        MyReader.Delimiters = {"~"}
        Dim currentRow As String()
        'Loop through all of the fields in the file. 
        'If any lines are corrupt, report an error and continue parsing. 
        While Not MyReader.EndOfData
            Try
                currentRow = MyReader.ReadFields()
                ' Include code here to handle the row.
                If currentRow.Count > maxColumnCount Then
                    maxColumnCount = currentRow.Count
                End If
            Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
                MsgBox("Line " & ex.Message & " is invalid.  Skipping")
            End Try
        End While
    End Using
    MessageBox.Show(maxColumnCount.ToString)
End Sub

Как только у меня будет необходимое количество столбцов , Я создал DataTable и добавил необходимое количество столбцов. Затем, когда пример инструктировал вас обрабатывать строку, я добавил строку в DataTable. Наконец, я отобразил DataTable в DataGridView.

Private Sub OPCode()

    Dim dt As New DataTable
    For i = 1 To 38
        dt.Columns.Add(i.ToString)
    Next

    Using MyReader As New TextFieldParser("C:\Users\xxx\test.txt")
        MyReader.TextFieldType = FieldType.Delimited
        MyReader.Delimiters = {"~"}
        Dim currentRow As String()
        'Loop through all of the fields in the file. 
        'If any lines are corrupt, report an error and continue parsing. 
        While Not MyReader.EndOfData
            Try
                currentRow = MyReader.ReadFields()
                ' Include code here to handle the row.

                dt.Rows.Add(currentRow)

            Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
                MsgBox("Line " & ex.Message & " is invalid.  Skipping")
            End Try
        End While
    End Using

    DataGridView1.DataSource = dt
End Sub

Подробнее c для ваших данных ...

Private Sub OpCode()

    Dim dt As New DataTable

    dt.Columns.Add("Date", GetType(Date))
    dt.Columns.Add("Customer Name", GetType(String))
    dt.Columns.Add("Address", GetType(String))
    dt.Columns.Add("City", GetType(String))
    dt.Columns.Add("State", GetType(String))
    dt.Columns.Add("Zipcode", GetType(String))
    dt.Columns.Add("RefID", GetType(String))
    dt.Columns.Add("Amount", GetType(Decimal))

    Dim DataDate As Date
    Dim RefID As String = ""
    Dim Amount As Decimal

    Using MyReader As New TextFieldParser("C:\Users\maryo\test.txt")
        MyReader.TextFieldType = FieldType.Delimited
        MyReader.Delimiters = {"~"}
        Dim currentRow As String()
        'Loop through all of the fields in the file. 
        'If any lines are corrupt, report an error and continue parsing. 
        While Not MyReader.EndOfData
            Try
                currentRow = MyReader.ReadFields()
                ' Include code here to handle the row.
                If currentRow(0) = "D" Then
                    DataDate = CDate(currentRow(3))
                    RefID = currentRow(17)
                    Amount = CDec(currentRow(20))
                End If
                If currentRow(0) = "O" Then
                    dt.Rows.Add({DataDate, currentRow(1), currentRow(2), currentRow(6), currentRow(7), currentRow(8), RefID, Amount})
                End If
            Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
                MsgBox("Line " & ex.Message & " is invalid.  Skipping")
            End Try
        End While
    End Using
    DataGridView1.DataSource = dt
End Sub

Я предположил, что применяется строка D в следующую строку O. Я сохранил данные из строки D в трех переменных и использовал их при чтении следующей строки.

Помните, что коллекции (включая массивы) равны нулю на основе. net.

...