首页 > 解决方案 > 如何将同一文件夹中的所有csv文件合并为一个数据

问题描述

我想合并来自同一文件夹的多个具有相同布局的 csv 文件

例子 :

csv1.csv

      ID, PINA,PINB,PCS

      1,100,200,450

      2,99,285,300

csv2.csv

      ID, PINA,PINB,PCS

      1,100,200,999

      2,99,285,998

out.csv(我想通过 VB.net 制作的文件)

      ID, PINA,PINB,PCS,PCS

      1,100,200,450,999

      2,99,285,300,998

我的问题代码:

 Dim FileReader As StreamReader
        Dim i As Integer = 0
        Dim temp As String
        For i = 0 To LstFiles.Items.Count - 1
            FileReader = File.OpenText(LstFiles.Items.Item(i))
            temp = FileReader.ReadToEnd
            File.AppendAllText(SaveFileDialog1.FileName, temp)
        Next

请指导我。

非常感谢 !

标签: vb.netwinformscsvmerge

解决方案


在我看来,输入文件中的每一行都有一个基于该行中第一个值的标识符。您希望将 ListBox 中所有文件中该标识符之后的所有数字组合成一个数字列表,该列表已排序且没有重复项。然后,您要生成一个输出文件,其中包含所有这些标识符,后跟每组排序的唯一数字。

如果这是正确的,那么试试这个:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    If SaveFileDialog1.ShowDialog = DialogResult.OK Then
        Dim header As String = ""
        Dim combinedLines As New SortedList(Of Integer, List(Of Integer))
        For Each filename As String In LstFiles.Items
            Dim lines = File.ReadLines(filename)
            If header = "" Then
                header = lines.First
            End If
            lines = lines.Skip(1)

            For Each line As String In lines
                Dim strValues = line.Split(",").AsEnumerable
                Try
                    Dim lineNumber As Integer = Integer.Parse(strValues.First)
                    strValues = strValues.Skip(1)
                    Dim numbers = strValues.ToList.ConvertAll(Of Integer)(Function(x) Integer.Parse(x))

                    If Not combinedLines.ContainsKey(lineNumber) Then
                        combinedLines.Add(lineNumber, New List(Of Integer)(numbers))
                    Else
                        combinedLines(lineNumber).AddRange(numbers)
                    End If
                Catch ex As Exception
                    MessageBox.Show("Error Parsing Line: " & line)
                End Try
            Next
        Next

        Using sw As New StreamWriter(SaveFileDialog1.FileName, False)
            sw.WriteLine(header)
            For Each numberSet In combinedLines
                Dim numbers = numberSet.Value.Distinct.ToList
                numbers.Sort()
                sw.WriteLine(numberSet.Key & "," & String.Join(",", numbers))
            Next
        End Using
    End If
End Sub

推荐阅读