首页 > 解决方案 > 当“列”是基于行的,需要旋转时,在 Windows 窗体应用程序中使用 vb.net 将 .csv 文件合并到 datagridview

问题描述

我在一个目录中有一个 .csv 文件列表(大约 120 个),我需要将其合并并导出到单个 csv 文件中以及放入 sql 服务器中。为此,我将有一个按钮,它将所有 csv 文件信息放入 datagridview 中,然后将 datagridview 导出到 csv 文件并导入到 sql 表中。除了处理 csv 文件的格式之外,我可以完成所有这些工作。csv 文件以一种奇怪的方式保存,其中列标题在 A 列下,数据在 B 列中。我基本上需要旋转表,然后上传到 datagridview。我不知道该怎么做:

.csv 文件示例:

编辑:我将所有 133 个列标题手动添加到 Datagridview。

 Column A            Column B
Column Header 1      Data for Column Header 1
Column Header 2      Data for column Header 2
 ......                .........
Column Header 133    Data for column Header 133

我需要列标题和信息不在这样的 2 列中。我可以使用 excel 手动更改 csv 文件,但这将用于 100 个文件。

到目前为止,这是我的代码

        Try

                Dim thereader As New StreamReader("Y:\Public\Sanmina Production\3-Projector MTF Test\MTFTest_LJ902A180412AT00022_2019-04-10_17-14-11.csv", Encoding.Default)
                Dim sline As String = ""
                Dim colsexpected As Integer = 133
                Do
                    sline = thereader.ReadLine
                    If sline Is Nothing Then Exit Do
                'Dim words() As String = sline.Split(",")
                Dim keptwords As New List(Of String)
                Dim dataentry() As String = sline.Split(",")
                'DataGridView1.Rows.Add("")
                For ix As Integer = 0 To 132
                    'DataGridView1.Rows(DataGridView1.Rows.Count - 1).Cells(ix).Value = dataentry
                    'keptwords.Add(dataentry(1))
                    kkeptwords.
                Next
                Dim sResult As String = ""

                For Each elem As String In keptwords
                    sResult &= elem & " "
                Next

                MsgBox(sResult)
            Loop
                thereader.Close()

            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try


            'strFileName = Dir()
        'Loop


    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try

添加空白行后,我停止了编码,因为我意识到我的结果会是什么。

标签: vb.netwinformscsvdatagridview

解决方案


我现在已经使这个工作处于最佳状态。我有目录循环工作,发现大部分错误来自没有将正确的空白行添加到正确的位置。此代码现在可以完全正常工作。但是,我最终使用了一种迂回的方法,通过查找字母 MTF 或 csv 文件中没有数据来跳过不需要的数据。这是有效的更新代码。

    Try
        DataGridView1.Rows.Add("")
        lblFile.Text = "Working"
        Dim i As Integer = 0
        Dim RowEdit As Integer = 0
        Dim Files() As String = Directory.GetFiles("Y:\Public\test\", "*.csv", SearchOption.TopDirectoryOnly)
        Dim ArrLength As Integer = Files.Length
        Dim ProgressBarStep As Decimal = 100 / ArrLength
        Dim ProgressBarTotal As Decimal = Nothing
        Dim sResult As String = ""
        For Each element As String In Files
            sResult &= element & " "
        Next
        'MsgBox(sResult)

        For Each element As String In Files
            'lblFile.Text = element
            PB1.Value = ProgressBarTotal


            Try
                i = 0
                Using myReader As New Microsoft.VisualBasic.FileIO.TextFieldParser(element)
                    myReader.TextFieldType = FileIO.FieldType.Delimited
                    myReader.SetDelimiters(",")

                    Dim currentRow As String()
                    While Not myReader.EndOfData
                        Try
                            currentRow = myReader.ReadFields()
                            Dim currentField As String
                            For Each currentField In currentRow
                                If currentField = "" Then
                                    'Must be value
                                    DataGridView1.Rows(0).Cells(i).Value = currentField
                                    i = i + 1
                                Else

                                    If currentField.Substring(0, 1) = "M" Then

                                        If currentField.Substring(1, 1) = "T" Then

                                            If currentField.Substring(2, 1) = "F" Then
                                                'Skip this one
                                                ' MsgBox("Skip")
                                            Else
                                                DataGridView1.Rows(0).Cells(i).Value = currentField
                                                i = i + 1
                                            End If
                                        Else
                                            DataGridView1.Rows(0).Cells(i).Value = currentField
                                            i = i + 1

                                        End If
                                    Else
                                        DataGridView1.Rows(0).Cells(i).Value = currentField
                                        i = i + 1

                                    End If
                                End If

                            Next
                        Catch ex As Exception
                            MsgBox(ex.ToString)
                        End Try
                    End While
                End Using

                DataGridView1.Rows.Add("")
                'RowEdit = RowEdit + 1
                'Select bottom row
                Dim nRowIndexLast As Integer = DataGridView1.Rows.Count - 1
                DataGridView1.Rows(nRowIndexLast).Selected = True
                Dim CurrentRow1 As DataGridViewRow = DataGridView1.CurrentRow
                Dim results As DataGridViewRow = CType(CurrentRow1.Clone(), DataGridViewRow)
                Dim currentindex As Int32 = DataGridView1.CurrentRow.Index
                DataGridView1.Rows.RemoveAt(currentindex)
                Dim newindex As Int32 = 0
                DataGridView1.Rows.Insert(0, results)
                ProgressBarTotal = ProgressBarTotal + ProgressBarStep
                i = 0

            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try

        Next
        DataGridView1.Rows.RemoveAt(DataGridView1.Rows.Count - 1)
    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try

    DataGridView1.Rows.RemoveAt(0)
    lblFile.Text = "Complete"

推荐阅读