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

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

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
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
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();
    }

}

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