#vb.net #csv
#vb.net #csv
Вопрос:
У меня есть файл CSV, который содержит некоторые значения. Это выглядит так:
1;11,19;91,69
1;2,8 ;26,54
2;0 ;2,79
2;7,8 ;0
3;0 ;35,44
1;0 ;8,89
2;27,33;16,5
3;0 ;35,49
2;0 ;42,69
2;0 ;93,09
Мне нужно записать новые строки в новый CSV, который содержит суммы столбцов 1 и 2, отсортированные по столбцу 0. Это должно выглядеть так:
1;13,99;127,12
2;35,13;155,07
3;0 ;70,93
Вначале я попытался вычислить суммы столбцов, но даже там у меня возникла проблема, и я не могу понять, как мне это сделать. И я далеко от своей цели с сортировкой по значениям столбца 0. Теперь мой код выглядит следующим образом.
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Dim file As String() = IO.File.ReadAllLines("pathinput.csv")
Dim sum As Decimal
sum = 0
Dim sb As New List(Of String)
For Each line In file
Dim col = line.Split(";"c)
Dim result As Decimal = sum col(1)
Dim result1 As Decimal = sum col(2)
sb.Add(String.Join(";", col(0) amp; ";" amp; result amp; ";" amp; result1))
Next
IO.File.WriteAllLines("pathoutput.csv", sb.ToArray())
End Sub
Я видел тот же вопрос с ответами для Python, но я понятия не имею, как преобразовать код в VB.Net .
РЕДАКТИРОВАТЬ: должен сказать, что числа в столбце 0 являются просто примерами и содержат более 50 уникальных значений.
Комментарии:
1. «1;13,99;127,12» <- как вы добрались до ’99’?
2. Вы знаете, что это не файл CSV, верно?
3. У меня есть разделитель; не запятая. 13,99 — результат значений 11,19 2,80 в первых двух строках.
Ответ №1:
Это должно приблизить вас к:
Dim result = _
lines _
.Select(Function(x) x.Split(";"c)) _
.Select(Function(x) New With _
{ _
.c1 = x(0), _
.c2 = Decimal.Parse(x(1).Trim(), System.Globalization.CultureInfo.GetCultureInfo("de-de")), _
.c3 = Decimal.Parse(x(2).Trim(), System.Globalization.CultureInfo.GetCultureInfo("de-de")) _
}) _
.GroupBy(Function(x) x.c1) _
.Select(Function(x) New With { .c1 = x.Key, .c2 = x.Sum(Function(y) y.c2), .c3 = x.Sum(Function(y) y.c3) }) _
.ToArray()
Это дает мне цифры, которые вы хотели.
Комментарии:
1. около двух часов я пытаюсь заставить этот код работать без успеха. Объявления не принимаются. «.» требуется с и с требуемым завершением и т. Д. И т. Д
2. @ИванОлександров Какую версию Visual Studio вы используете? Я попробовал этот код в VS2017 на случай, если была опечатка или что-то в этом роде, но для меня это сработало без проблем.
3. @ИванОлександров — Я тестирую весь код перед его публикацией. Это работает просто отлично.
Ответ №2:
Чтобы уточнить, на самом деле вам не нужно сортировать записи, вы должны сгруппировать их по первому столбцу и суммировать второй и третий из каждой группы.
Вот еще одно решение:
Imports System.IO
Imports System.Linq
Imports System.Globalization
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Dim inputFile = "path/input.csv"
Dim outputFile = "path/output.csv"
Dim ci = New CultureInfo("de-DE")
File.WriteAllLines(outputFile, File.ReadLines(inputFile).
Select(Function(x) x.Split(";"c)).
GroupBy(Function(x) Integer.Parse(x(0))).
Select(Function(x)
Return String.Format(
"{0};{1};{2}",
x.Key,
x.Sum(Function(y) Decimal.Parse(y(1), ci)),
x.Sum(Function(y) Decimal.Parse(y(2), ci)))
End Function).ToArray)
End Sub
Комментарии:
1. Спасибо, это работает! Еще один вопрос. На самом деле мой csv содержит более 3 столбцов, только для немногих из них мне нужны суммы, но я хочу сохранить другие столбцы в новом csv. Как добавить их в строку. Формат?
2. @Иван Олександров You are welcome. Вы можете добавить больше заполнителей в
String.Format
метод:{0};{1};{2};{3};{N}
и установить их значения, как показано выше. Таким образом, после последнегоx.Sum(..)
вы можете добавить дополнительные значения, разделенные запятыми, используяSelect
метод, подобный:x.Select(Function(y) y(3)) : x.Select(Function(y) y(4))
и так далее.3. Да! Я заставил его работать с первым выбором x.Select(Function(y) y(3)).Сначала и так далее