Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
2 / 2 / 0
Регистрация: 09.10.2014
Сообщений: 28

Дан txt файл. Необходимо сделать выборку по времени сигналов

09.10.2014, 15:50. Показов 3222. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Я новичок в этом деле, в учебниках, которые посмотрел, не нашёл нужного. А задача стоит такая:
Дан txt файл. В каждой строке, начиная с N-ой, записано время и имя события. Например:
Время Имя
06.08.2014 11:36:53,5 00_F0
06.08.2014 11:36:53,5 00_F1
06.08.2014 11:36:53,5 00_F2
06.08.2014 11:36:53,9 00_F0
06.08.2014 11:36:60,0 00_F1
...

Необходимо сделать выборку по времени тех сигналов, которые встречаются в тексте при построчном чтении сверху вниз чаще, чем 1 раз в 0,5 секунд (имеется ввиду в соответствии с тем временем, что указано в столбце "Время") и вывести результат с именем такого сигнала (сигналов) на экран. В примере сверху это сигнал с именем 00_F0.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.10.2014, 15:50
Ответы с готовыми решениями:

Дан txt файл. Необходимо сделать выборку по времени сигналов
Здравствуйте! Я новичок в этом деле, в учебниках, которые посмотрел, не нашёл нужного. А задача стоит такая: Дан txt файл. В каждой...

Дан текстовый файл f.txt содержащий действительные числа, найти количество чисел 0, результат вывести на файл g.txt
PascalABC Дан текстовый файл f.txt содержащий действительные числа, найти количество чисел 0, результат вывести на файл g.txt

Дан текстовый файл f.txt содержащий действительные числа, найти количество чисел 0, результат вывести на файл g.txt
Дан текстовый файл f.txt содержащий действительные числа, найти количество чисел 0, результат вывести на файл g.txt

33
25 / 25 / 16
Регистрация: 06.06.2014
Сообщений: 64
10.10.2014, 16:15
Студворк — интернет-сервис помощи студентам
Sipakov,

У Вас проблема с датой в самом файле, в моей программе формат даты таков
C++
1
dd.MM.yyyy HH:mm:ss,fff
, но в текстовом файле встречается
C++
1
d.MM.yyyy HH:mm:ss,fff
в следствие чего происходит ошибка "Строка не распознана как действительное значение DateTime."

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
StreamReader reader = new StreamReader("TxtFile.txt");
 
            reader.ReadLine();
 
            string line;
 
            DateTime dateTime;
            string name;
            List<DateTime> dateList = new List<DateTime>();
            List<string> nameList = new List<string>();
            List<DateTime> newDateList = new List<DateTime>();
            List<string> newNameList = new List<string>();
            char[] elements = { ' ', '\t' };
            //dd.MM.yyyyHH:mm:ss,f
            while ((line = reader.ReadLine()) != null)
            {
                string[] str = line.Split();
                dateTime = DateTime.ParseExact(str[0] + str[1], "dd.MM.yyyyHH:mm:ss,fff", null);
                name = str[2];
                dateList.Add(dateTime);
                nameList.Add(name);
 
                //Console.WriteLine(dateTime.ToString("dd.MM.yyyy HH:mm:ss,fff") + " " + name);
            }
 
 
 
            for (int i = 0; i < dateList.Count; i++)
            {
                for (int j = i + 1; j < dateList.Count; j++)
                {
                    int result = (dateList[j] - dateList[i]).Milliseconds;
 
                    if (nameList[i].Equals(nameList[j]) & dateList[i].ToString("dd.MM.yyyy HH:mm:ss").Equals(dateList[j].ToString("dd.MM.yyyy HH:mm:ss")) & (dateList[j] - dateList[i]).Milliseconds <= 500)
                    {
                        newNameList.Add(nameList[i]);
                        newDateList.Add(dateList[i]);
                        newNameList.Add(nameList[j]);
                        newDateList.Add(dateList[j]);
                    }
                }
            }
 
            Console.WriteLine();
 
            for (int i = 0; i < newNameList.Count; i++)
            {
                Console.WriteLine(newDateList[i].ToString("dd.MM.yyyy HH:mm:ss,fff") + " " + newNameList[i]);
            }
 
            reader.Close();
 
            Console.ReadLine();
1
2 / 2 / 0
Регистрация: 09.10.2014
Сообщений: 28
10.10.2014, 16:30  [ТС]
rRczZZ, хорошо получилось, только выводит всю строку целиком вместе с описанием. Но с этим, наверно, и я справлюсь с помощью стринг) Спасибо
0
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
10.10.2014, 16:31
Sipakov, поменяйте на всякий случай еще регулярку на такую
C#
1
Regex r = new Regex(@"(?<time>\d+.\d+.\d+ \d+:\d+):(?<msec>\d+,\d+)\s*(?<name>\S+)");
1
2 / 2 / 0
Регистрация: 09.10.2014
Сообщений: 28
10.10.2014, 16:37  [ТС]
AdamFreeman, хм.. Но я вроде специально сделал файл поменьше, чтобы там ничего такого не было
Вложения
Тип файла: txt 14.txt (4.4 Кб, 7 просмотров)
0
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
10.10.2014, 16:42
Sipakov, ну работает же? 0 совпадений (по времени)
0
2 / 2 / 0
Регистрация: 09.10.2014
Сообщений: 28
10.10.2014, 16:44  [ТС]
rRczZZ, хорошо, сейчас поменяю
0
25 / 25 / 16
Регистрация: 06.06.2014
Сообщений: 64
10.10.2014, 16:45
Sipakov, какой результат ожидаете? У меня сигналов не найдено
0
2 / 2 / 0
Регистрация: 09.10.2014
Сообщений: 28
10.10.2014, 16:47  [ТС]
rRczZZ, если Вы про новый текст AdamFreeman, то да. Если сейчас всё поменять, как он сказал, в текстовом файле, то работает. Только что проверил
0
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
10.10.2014, 16:51
Sipakov, ну ok) в моем варианте все время работало правильно имхо) Таких строк:
C#
1
d.MM.yyyy HH:mm:ss,fff
я не нашел, но если они и есть, то вторая регулярка их обработает нормально.
0
2 / 2 / 0
Регистрация: 09.10.2014
Сообщений: 28
10.10.2014, 16:51  [ТС]
AdamFreeman, rRczZZ, всё хорошо. Я на выходных посмотрю оба текста программ, постараюсь разобраться в регулярных выражениях и способе, предложенном AdamFreeman и как вообще это работает, потому что много еще конечно не понимаю. Если какие-то вопросы будут по этой теме и этому вопросу я тогда к Вам в этой ветке обращусь. Спасибо Вам!
0
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
10.10.2014, 16:52
и да, в моем случае секунды 60+ также считает нормально
0
2 / 2 / 0
Регистрация: 09.10.2014
Сообщений: 28
11.10.2014, 11:30  [ТС]
rRczZZ, там действительно есть d.MM.yyyy HH:mm:ss,fff, но считает нормально, ага

Добавлено через 18 часов 34 минуты
rRczZZ, если Вас не затруднит, прокомментируйте строки в тексте программы о их назначении, пожалуйста. И может есть книга какая нибудь, которая на Ваш взгляд наиболее хорошо и доступно объясняет регулярные выражения
0
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
11.10.2014, 15:50
Sipakov,
регулярка

Все что нужно есть тут и тут, пример про собачку (@)
Рассмотри строку:
C#
1
"06.08.2014 11:36:53,5 00_F0"
Вытащим все цифры регуляркой
C#
1
@"\d"
Она значит "Ровно одна цифра", будет найдено 17 совпадений (0,6,0,8,2,0,1,4,1,1,3,6,5,3,5,0,0,0). Добавим плюс
C#
1
@"\d+"
"Максимальное число последовательных цифр", будет найдено 9 штук (06,08,2014,11,36,53,5,00,0). Добавим Справа точку-разделитель даты, её нужно экранировать (см. в первой статье)
C#
1
@"\d+\."
"Максимальное число последовательных цифр оканчивающихся точкой". Совпадений уже два ("06.", "08."). Аналогично:
C#
1
@"\d+\.\d+\.\d+"
Вытащит дату (06.08.2014). Укажем, что справа может стоять ровно один пробел
C#
1
@"\d+\.\d+\.\d+ "
И добавим время
C#
1
@"\d+\.\d+\.\d+ \d+:\d+:\d+,\d+"
Укажем что справа может стоять "Любое число пробелов" (ноль пробелов тоже может)
C#
1
@"\d+\.\d+\.\d+ \d+:\d+:\d+,\d+\s*"
И Вытащим максимальную последовательность НЕ пробелов (как встретится первый - совпадение закончится)
C#
1
@"\d+\.\d+\.\d+ \d+:\d+:\d+,\d+\s*\S+"
Сгруппируем по Дате, миллисекундам и имени
C#
1
@"(\d+\.\d+\.\d+ \d+:\d+):(\d+,\d+)\s*(\S+)"
Дадим группам имена
C#
1
@"(?<time>\d+\.\d+\.\d+ \d+:\d+):(?<msec>\d+,\d+)\s(?<name>\S+)"
код

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// Создаст объект Regex, вычислит регулярку один раз(!)
Regex r = new Regex(@"(?<time>\d+\.\d+\.\d+ \d+:\d+):(?<msec>\d+,\d+)\s*(?<name>\S+)");
 
// Словарь Срока-Время, для хранения к каждому Имени Последнего встретившегося времени
// Обеспечит быстрый поиск по Имени ("00_F0", "00_F1", ...)
var d = new Dictionary<String, DateTime>();
 
// Это множество. Здесь все элементы уникальны (не повторяются)
var hs = new HashSet<String>();
 
// Перебираем все строки из файла по одной
foreach(var s in File.ReadLines(@"p:\1.txt"))
{
    var Matches = r.Matches(s); // Применяем регулярку к кстроке
    if (Matches.Count > 0) // Если совпадений больше чем ноль
    {
        // Считаем, что в каждой строке совпадение ровно одно. Оно лежит в Matches[0]
        
        string name = Matches[0].Groups["name"].Value; // Вытащим групппу (?<name>...)
        // Вытащим групппу (?<time>...) это дата и время без секунд, Преобразуем к DateTime
        // Вытащим группу (?<msec>\d+,\d+) это секунды с дробной частью,
        // Умножим на 1000 - получим миллисекунды и добавим к нашем времени
        DateTime time = DateTime.Parse(Matches[0].Groups["time"].Value) 
            .AddMilliseconds(Double.Parse(Matches[0].Groups["msec"].Value) * 1000);
 
        if (!d.ContainsKey(name)) // Если Имя еще не встречалось
        {
            // Добавим его в словарь
            d.Add(name, time);
        }
        else
        {
            // А если встречалось
            // Вчислим разницу запомненного в словаре времени и времени на текущей строке
            TimeSpan ts = time - d[name];
            
            // Полсекунды это 500 миллисекунд
            if (ts.TotalMilliseconds < 500)
            {
                // Нашли Нужный элемент. 
                // Добавим его во множество ответов. 
                // Если добавлять одинаковые имена ("00_F0", "00_F0")
                // То во множестве будет только одна копия
                hs.Add(name);
            }
            d[name] = time; // И заменим прошлое время, на время с этой строки
        }
    }
}
 
foreach (var name in hs) // Во множестве ответов переберем все элементы
{
    // И выведем их на экран
    Console.WriteLine(name);
}
0
2 / 2 / 0
Регистрация: 09.10.2014
Сообщений: 28
12.10.2014, 10:01  [ТС]
rRczZZ, благодарю, буду дальше изучать)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.10.2014, 10:01

Дан файл text.txt, там два числа: 2 и 11. Найти их сумму и записать ее в файл out.txt
Я знаю как написать программу для нахождения сумы в Delphi, но я не знаю как написать вот такую программу: Дан файл text.txt, там два...

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

Необходимо сделать выборку из таблицы dbf
необходимо сделать выборку из таблицы dbf поле index - string Dim n As String n = &quot;157164&quot; Set rs = .Execute(&quot;SELECT Index,...

Entity Framework вложенный foreach, необходимо сделать выборку из объекта
Всем привет! Давно не могу решить проблему выборки данных. Копирую записи связанных таблиц в БД. Есть объект Land, который по полю Id...

Файл: Что необходимо дописать, чтобы информация, введенная в InputBox, записывалась в txt файл?
Доброго времени суток. Нашел код на wsf для ввода данных. Что необходимо дописать, что бы информация введенная в InputBox, записывалась в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него. https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952 Инструкция внутри. https:/ / youtu. be/ VpfFZSUDGnQ. . .
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru