Как объединить все CSV-файлы из одной папки в один data

#vb.net #winforms #csv #merge

#vb.net #winforms #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  

Пожалуйста, подскажите мне.

Большое спасибо!

Комментарии:

1. Отличаются ли друг от друга только последние значения в каждой строке? Значит, максимальное количество записей в строке равно 5? Или вы объединяете «n» файлов, чтобы в каждой результирующей строке могло быть «n» записей? И первая строка всегда будет выглядеть так?

2. Пожалуйста, объясните логику объединения CSV-файлов. Непонятно.

Ответ №1:

Мне кажется, что каждая строка во входных файлах имеет идентификатор, основанный на первом значении в этой строке. Вы хотите объединить все числа после этого идентификатора из всех файлов в вашем 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: " amp; 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 amp; "," amp; String.Join(",", numbers))
            Next
        End Using
    End If
End Sub