Как найти среднее из нескольких строк текстового файла

Мне нужно взять число из каждой строки текстового файла и найти среднее значение. Я использую потоковый ридер, чтобы взять номер из текстового файла, я не знаю, куда идти дальше. Вот что я сделал до сих пор

using (StreamReader sr = new StreamReader("pupilSkiTimes.txt"))
{
    string line = "";
    while ((line = sr.ReadLine()) != null)
    {
        string[] components = line.Split("~".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
        skiTime.Add(components[7]);
    }
    sr.Close();
}

Как мне заставить это читать из каждой строки текстового файла, и как только это будет сделано, как мне получить среднее значение.

Если вам нужно знать, данные, которые я пытаюсь прочитать, удваиваются, например, "23.43"

Не могли бы вы предоставить пример файла (с желаемым результатом), пожалуйста?

Dmitry Bychenko 10.04.2022 15:42

В идеале любой, кто отвечает на вопрос, должен иметь возможность скопировать ваш код, вставить его в текстовый редактор, скомпилировать, запустить и наблюдать за проблемой. И, к сожалению, с вашим постом это невозможно.

Mohi 10.04.2022 15:47

Здравствуйте @ShadySpiritomb, можете ли вы показать нам структуру строки вашего текстового файла?

AwatITWork 10.04.2022 15:50

В текстовом файле есть строки с разными данными, каждая из которых разделена знаком «~». Мне нужна только одна часть каждой строки, для чего предназначены компоненты[7].

ShadySpiritomb 10.04.2022 16:27

Например, 0~0~0~0~0~0~0~22.65~0~0~0 является допустимой строкой?

John Alexiou 10.04.2022 17:45
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
61
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вот как я это сделаю, как вы упомянули в комментариях components[7], это двойные данные, которые вы читаете из файла.

Нам нужно разобрать его на удвоение, суммировать и разделить на время подсчета, которое мы можем разобрать число в файле. Если число не анализируется и вы хотите получить общее среднее значение всех строк, переместите счетчик из оператора if.

using (StreamReader sr = new StreamReader("pupilSkiTimes.txt"))
{
    string line;
    double sum = 0;
    int count = 0;
    while ((line = sr.ReadLine()) != null)
    {
        string[] components = line.Split("~".ToCharArray(),
            StringSplitOptions.RemoveEmptyEntries);
        if (double.TryParse(components[7], out var result))
        {
            count++;
            sum += result;
        }
    }
    sr.Close();

    var average = sum / count;

    Console.WriteLine(average);
}

Просто суммируйте, а затем разделите на число, список не нужен (он не вычисляет никаких других показателей).

eocron 10.04.2022 16:09

Полностью согласен, я просто жду ответа OP и обновлю свой ответ.

Maytham 10.04.2022 16:15

что вам нужно, чтобы я ответил, извините, я ужасен в С# и действительно не понимаю, что будет делать список

ShadySpiritomb 10.04.2022 16:29

Нет проблем, успокойтесь, все мы когда-то начинали, если у вас есть еще вопросы, просто задавайте, и мы стараемся изо всех сил.

Maytham 10.04.2022 16:52

Это говорит мне, что ссылочные типы с нулевым значением недоступны в С# 7.3, есть ли версия этого, которая работает в версии 7.3?

ShadySpiritomb 10.04.2022 17:43

Вы можете удалить строку вопросительного знака? line или обновите свой язык C Sharp до версии 8.0. я обновил свой ответ

Maytham 10.04.2022 17:45

Спасибо, просто интересно, как после этого превратить двойное значение в строку?

ShadySpiritomb 10.04.2022 18:51

По какой-то причине он отображается как System.Collections.Generic.List`1[System.Double], что это значит, как мне это исправить

ShadySpiritomb 10.04.2022 19:10

Именно поэтому я не даю вам произвольный ответ. Что именно вы сделали, чтобы это работало раньше. Или попытаться сделать больше.

Maytham 10.04.2022 19:16

я только что попытался изменить txt метки на skiTime

ShadySpiritomb 10.04.2022 19:45

среднийSkiTimeLBL.Text = skiTime.ToString();

ShadySpiritomb 10.04.2022 19:45

я сейчас в отъезде посмотрю когда вернусь

Maytham 10.04.2022 19:54

Я исправил проблему, я пытался сделать метку = skiTime, когда я должен был использовать среднее значение.

ShadySpiritomb 10.04.2022 20:11

Круто рад это узнать

Maytham 10.04.2022 20:47

Я думаю, что удобный метод для такой ситуации полезен, надеюсь, вы его используете, я использую аналогичный this в своих кодах.

Я проезжаю FilePath, разделитель и значение индекса

    static double getAvgAtIndex(string fPath, char seperator, int index)
    {
        double sum = 0;
        int counter = 0;

        using (StreamReader sr = new StreamReader(fPath))
        {

            string line = "";
            while ((line = sr.ReadLine()) != null)
            {
                double rawData = 0;
                string[] lineData = line.Split(seperator, StringSplitOptions.RemoveEmptyEntries);
                double.TryParse(lineData[index], out rawData);

                sum += rawData;
                counter++;
            }
            sr.Close();
        }

        return sum / counter;
    }

Использование этого,

    static void Main(string[] args)
    {
        Console.WriteLine("The Avg is: {0}", getAvgAtIndex(@"..\myTextFile.txt", '~' ,1)); 
        // The Avg is: 34.688
    }

Вот как использовать LINQ, чтобы немного очистить код

static class Program
{
    static void Main(string[] args)
    {
        var data = File.ReadAllLines("pupilSkiTimes.txt")
                     .Select((line)=> line.Split("~".ToCharArray(), StringSplitOptions.RemoveEmptyEntries));

        List<double> skiTime = new List<double>();
        foreach (var parts in data)
        {
            if (double.TryParse(parts[7], out double x))
            {
                skiTime.Add(x);
            }

        }

        double average = skiTime.Average();
    }

}

Другие вопросы по теме