Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.09.2015, 11:29   #11
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

во-первых,
Цитата:
Код:
 var V = Regex.Match(elements[i], @"\d\d:\d\d:\d\d");
это зачем?
это не нужно от слова СОВСЕМ!

во-вторых, файловый поток A тоже нужно закрывать.


попробуйте тогда уже так:

Код:
            //Цикл для считывания строк
            for (int i = 19; i < 1000; i++)
            {   
                //Установка разделителем массива запятой
                string[] elements = readText[i].Split(',');
                
                if (elements.GetLength(0) > 4) 
                {
                
                    //Сумма времени всех строк
                   if (TimeSpan.TryParse(elements[4], out current_time))
                   {
                        W.WriteLine(elements[4]);        //Вывод 4 элемента массива в файл

                        if (current_time > new TimeSpan(2, 0, 0)) {
                               A.WriteLine("{0:hh\\:mm\\:ss}",current_time);  // в отдельный файл выведем значение более 2-х часов
                        }

                        intervaltimesum += current_time;
                        countTime++;
                   }
                }
             }  

             A.Close();

             //Вывод среднего времени в нужном формате
             TimeSpan intervalAverage = TimeSpan.FromSeconds(intervaltimesum.TotalSeconds / countTime);
             Console.WriteLine("Среднее время = {0:hh\\:mm\\:ss}", intervalAverage);
                
             //Запись в файл времени   
             W.WriteLine("{0:hh\\:mm\\:ss}",intervalAverage);
             W.Close();
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.09.2015, 11:36   #12
Fil_1990
Пользователь
 
Регистрация: 23.09.2015
Сообщений: 76
По умолчанию

Заработало спасибо ,но вот вопрос там есть значения такие как 220:19:18

Чтобы такие тоже учитывались и записывались.
Fil_1990 вне форума Ответить с цитированием
Старый 29.09.2015, 11:46   #13
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Fil_1990 Посмотреть сообщение
Заработало спасибо
пожалуйста.

Цитата:
Сообщение от Fil_1990 Посмотреть сообщение
но вот вопрос там есть значения такие как 220:19:18

Чтобы такие тоже учитывались и записывались.
ну, значения, как значения, что с ними не так?
и что, они сейчас не учитываются?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.09.2015, 11:53   #14
Fil_1990
Пользователь
 
Регистрация: 23.09.2015
Сообщений: 76
По умолчанию

Да вывелись в файл все кроме значений:

220:23:34
113:34:12
Я думаю он не выведет время более 24 часов.
Возможна реализация такого алгоритма?
Что в формате времени hh представить как int и если это значение больше 2 то также записывать элемент массива в файл?
Fil_1990 вне форума Ответить с цитированием
Старый 29.09.2015, 13:52   #15
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

угу. вижу. действительно, TryParse тупит на таких строках.

тогда пробуйте так:
Код:

                if (elements.GetLength(0) > 4) 
                {
               	try {
	               	string[] times = elements[4].Split(':');
			int hours = int.Parse(times[0]);
			int minutes = int.Parse(times[1]);
			int seconds = int.Parse(times[2]);
               	        current_time = TimeSpan.FromSeconds(seconds) + TimeSpan.FromMinutes(minutes) + TimeSpan.FromHours(hours);
						
                        W.WriteLine(elements[4]);        //Вывод 4 элемента массива в файл
                        if(current_time.TotalHours>2){
                        	     A.WriteLine("{0}",current_time);  // в отдельный файл выведем значение более 2-х часов
                        }

                        intervaltimesum += current_time;
                        countTime++;

                	} catch (Exception) {
                		
                		throw;
                	}
                }
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.09.2015, 14:16   #16
Fil_1990
Пользователь
 
Регистрация: 23.09.2015
Сообщений: 76
По умолчанию

Теперь вывел в таком формате,в принципе приемлимо, но хотелось бы увидеть в таком 220:23:22(к примеру)
4.17:37:37
9.04:19:18
Поясните пожалуйста код
Обязательно использовать try catch конструкцию?????
Среднее время почему то поменялось?

Последний раз редактировалось Fil_1990; 29.09.2015 в 14:27.
Fil_1990 вне форума Ответить с цитированием
Старый 29.09.2015, 14:38   #17
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
но хотелось бы увидеть в таком 220:23:22(к примеру)
либо выводите просто строку до разбора:
Код:
                        W.WriteLine(elements[4]);        //Вывод 4 элемента массива в файл
                        if(current_time.TotalHours>2){
                        	     A.WriteLine(elements[4]);  // в отдельный файл выведем значение более 2-х часов
                        }
либо выводите часы отдельно, минуты и секунды.

Цитата:
Поясните пожалуйста код
Обязательно использовать try catch конструкцию?????
перехват ошибок - это чтобы программа не вывалилась, если там вместо времени будет мусор какой-нибудь - текст, например...

Цитата:
Среднее время почему то поменялось?
предположу, что среднее время выросло и очень значительно.
раньше 220 часов, 113 часов игнорировались tryParse, и не включались в общее время. А теперь - включаются.
поэтому, если 9 раз по одной минуте потребовалось, а один раз 220 часов, то, в среднем потребуется 1320 минут. Логично?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.09.2015, 14:48   #18
Fil_1990
Пользователь
 
Регистрация: 23.09.2015
Сообщений: 76
По умолчанию

Вот и в чём подвох, что время сейчас выводится меньше

Раньше было с учётом 220 ч и 110 ч 05:27:33
а сейчас 00:23:14 вот не могу понять почему?

Или может при подсчёте он исключает эти строки
Fil_1990 вне форума Ответить с цитированием
Старый 29.09.2015, 14:51   #19
Fil_1990
Пользователь
 
Регистрация: 23.09.2015
Сообщений: 76
По умолчанию

Вот код
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {   //Путь к файлу
            string path = @"C:\Users\a.filatov\Desktop\1\COMMA.txt";

            //Читаем текст в файле построчно
            string[] readText = File.ReadAllLines(path);

            //Объявляем интервал времени
            TimeSpan intervaltimesum = new TimeSpan();

            //Текущее время в элементе массива
            TimeSpan current_time;

            //Счётчик
            int countTime = 0;

            //Создание потока для записи в файл
            StreamWriter W = new StreamWriter(@"C:\Users\a.filatov\Desktop\1\Write.txt");
            StreamWriter A = new StreamWriter(@"C:\Users\a.filatov\Desktop\1\Incorrect.txt");

            //Цикл для считывания строк
            for (int i = 19; i < 1000; i++)
            {
                //Установка разделителем массива запятой
                string[] elements = readText[i].Split(',');

                if (elements.GetLength(0) > 4)
                {
                    //Разбор 4 элемента массива
                    try
                    {
                        string[] times = elements[4].Split(':');
                        int hours = int.Parse(times[0]);
                        int minutes = int.Parse(times[1]);
                        int seconds = int.Parse(times[2]);
                        current_time = TimeSpan.FromHours(hours) + TimeSpan.FromMinutes(minutes) + TimeSpan.FromSeconds(seconds);

                        W.WriteLine(elements[4]);        //Вывод 4 элемента массива в файл
                        if (current_time.TotalHours > 2)
                        {
                            A.WriteLine("{0}", current_time);  // в отдельный файл выведем значение более 2-х часов
                        }

                        intervaltimesum += current_time;
                        countTime++;

                    }
                    catch (Exception)
                    {

                        throw;
                    }
                }


            }
            //Закрытие потока 
            A.Close();

            //Вывод среднего времени в нужном формате
            TimeSpan intervalAverage = TimeSpan.FromSeconds(intervaltimesum.TotalSeconds / countTime);
            Console.WriteLine("Среднее время = {0:hh\\:mm\\:ss}", intervalAverage);

            //Запись в файл времени   
            W.WriteLine("{0:hh\\:mm\\:ss}", intervalAverage);
            W.Close();

        }

    }
}
Fil_1990 вне форума Ответить с цитированием
Старый 29.09.2015, 15:38   #20
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

понятно. среднее время выводите БЕЗ формата (он дни не показывает и получается косяк!):

Код:
            //Вывод среднего времени в нужном формате
            TimeSpan intervalAverage = TimeSpan.FromSeconds(intervaltimesum.TotalSeconds / countTime);
            Console.WriteLine("Среднее время = {0}", intervalAverage);

            //Запись в файл времени   
            W.WriteLine("{0}", intervalAverage);
            W.Close();
я прав?
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не работает вывод результат проверки теста. Utyf Помощь студентам 0 05.05.2013 14:55
C++ при написание слова вывод строчки. olegass Помощь студентам 0 12.02.2013 01:22
3 условия проверки. Оптимизация. artemavd Общие вопросы Delphi 15 22.12.2011 13:40
вывод в файл Dimarik Общие вопросы C/C++ 20 21.03.2011 19:40