#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