VB.net общая сумма из CSV-файла

#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)).Сначала и так далее