Невозможно создать CSV-файл из таблицы данных и данных. - PullRequest
0 голосов
/ 20 января 2020

У меня есть код, который создает CSV-файл (с заголовками), который содержит поля, идентифицирующие пиксельные местоположения точек интереса в выбранных изображениях. К сожалению, иногда возникают дубликаты, которые вызывают проблемы позже в моем производственном процессе. Я планирую решить эту проблему, чтобы открыть файл CSV посреди приложения, прочитать данные в таблицу данных, отсортировать таблицу данных с представлением данных, используя 4 ключа сортировки (я использую по умолчанию Column1, Column2 et c) поскольку я не могу понять, как использовать настоящие имена заголовков столбцов, содержащиеся в первой строке. Я попытался записать результирующие строки в новый файл, и я получил правильное количество строк в выходном CSV-файле, но данные в строке отсутствуют, и я получил текстовую строку 'System.Data.DataRowView, а не 12 полей, которые я ожидал.

В коде моей последней попыткой является создание writeOutPutLine, содержащего объединенное содержимое строки, в желаемом порядке сортировки.

Я пытался использовать CSVHelper безуспешно, а также пробовал около 10 других наборов кодов, размещенных на различных веб-сайтах.

Вот мой код

Sub New_Csv_Sort ()

    Dim linecount As Integer = 1
    Dim dt As DataTable = New DataTable 
    Dim dgv As DataGridView = New DataGridView
    Dim TextLine As String = ""
    Dim SplitLine() As String
    Dim objReader As New System.IO.StreamReader(TargetFileName, Encoding.ASCII)
    Dim ColumnCount As Integer = 0

    For ColumnCount = 1 To 13 Step 1
        dt.Columns.Add()
    Next

    Dim firstline As Boolean = True


    Do While objReader.Peek() <> -1
        TextLine = objReader.ReadLine()
        SplitLine = Split(TextLine, ",")
        dt.Rows.Add(SplitLine)
        If FirstTime = True Then 


' Here I was trying to use the first line to set the column labels but no joy
            ' For ColumnCount = 1 To 12 Step 1
            ' dt.datacolumn.
            ' Next
        End If
    Loop

    ' This next is commentted out in the sort statement because I could not get the column names to be recognised

'.Sort = "Datum ASC, Picture ASC, Y_Loc ASC, X_Loc, ASC"

    Dim dv As New DataView(dt) With {
    .Sort = "Column5 ASC, Column1 ASC, Column12 ASC, Column11 ASC"
    }
    FileOpen(SortedTargetFileNumber, SortedTargetFileName, OpenMode.Output)

' Я посмотрел, что данные и они правильно прочитаны Но моя строка вывода tra sh!

    For Each Rowview As DataRowView In dv
        'WriteOutPutLine = dv.row
        For Each DataColumn In dt.Columns
            WriteOutPutLine = WriteOutPutLine & Row[col].tostring() & ","
        Next
        WriteOutPutLine = Rowview.ToString
        PrintLine(SortedTargetFileNumber, WriteOutPutLine)
        linecount = linecount + 1
    Next
    FileClose(SortedTargetFileNumber)
    MsgBox("Sorted Lines = " & linecount)


End Sub

Ответы [ 2 ]

0 голосов
/ 21 января 2020
 Sub New_Csv_Sort()
    Dim dt As DataTable = New DataTable
    Dim TextLine As String = ""
    Dim SplitLine() As String
    Dim objReader As New System.IO.StreamReader(TargetFileName, Encoding.ASCII)
    Dim ColumnCount As Integer = 0

    'Create columns for the data - 
    For ColumnCount = 1 To 13 Step 1
        dt.Columns.Add()
    Next

    'Load the datatable
    Do While objReader.Peek() <> -1
        TextLine = objReader.ReadLine()
        SplitLine = Split(TextLine, ",")
        dt.Rows.Add(SplitLine)
    Loop

    'This is the sort order based on the header titles, but is translated the the default column name

    '.Sort = "Datum ASC, Picture ASC, Y_Loc ASC, X_Loc ASC"

    Dim dv As New DataView(dt) With {
    .Sort = "Column5 ASC, Column1 ASC, Column12 ASC, Column11 ASC"
    }
    'Open the output file

    FileOpen(SortedTargetFileNumber, SortedTargetFileName, OpenMode.Output)

    'Create a string of all the rows in the dataview separated by commas

    Dim DataLine As String = ""
    For Each r As DataRowView In dv
        DataLine &= String.Join(",", r.Row.ItemArray) & Environment.NewLine
    Next
    ' Write the data to a file
    WriteOutPutLine = DataLine
    PrintLine(SortedTargetFileNumber, WriteOutPutLine)
    FileClose(SortedTargetFileNumber)
    ' and we are done
    End Sub
0 голосов
/ 20 января 2020

попробуйте эту функцию

Private Function ConvertToCSV(ByVal dt As DataTable) As String
    Dim sb As New Text.StringBuilder()
    For Each row As DataRow In dt.Rows
        sb.AppendLine(String.Join(",", (From i As Object In row.ItemArray Select i.ToString().Replace("""", """""").Replace(",", "\,").Replace(Environment.NewLine, "\" & Environment.NewLine).Replace("\", "\\")).ToArray()))
    Next

    Return sb.ToString()
End Function
...