Как отпарсить текст - C#

Узнай цену своей работы

Формулировка задачи:

Всем привет. Вообщем, есть одна проблемка, ребят, подскажите как отпарсить текст формата (Вместо звездочек, в номере телефона тоже цифры, не обращайте внимание) 01.06.13 00:02:52 Страйк Исходящий на Билайн +79637436**1 29 01:00 0.35 0.35 01.06.13 00:20:14 БВ Бесплатный входящий +79535392**9 262 04:22 0.00 0.00 01.06.13 00:25:13 БВ Бесплатный входящий +79535392**9 827 13:47 0.00 0.00 01.06.13 01:02:01 БВ Бесплатный входящий +79535392**9 32 00:32 0.00 0.00 01.06.13 01:29:16 БВ Входящее SMS 900 0 00:00 0.00 0.00 01.06.13 01:29:49 Страйк Исходящий на Билайн +79637436**1 36 01:00 0.35 0.35 01.06.13 01:49:31 Страйк Исходящий на своего +79535392**9 42 01:00 0.35 0.35 01.06.13 01:50:05 Страйк Исходящий на своего +79535392**9 4 01:00 0.35 0.35 01.06.13 01:51:36 БВ Входящее SMS +79535392509 0 00:00 0.00 0.00 01.06.13 01:52:10 Страйк Исходящий на своего +79535392**9 3 00:00 0.00 0.00 01.06.13 02:36:01 Страйк Исходящий на Билайн +79637436**1 17 01:00 0.35 0.35 Вот примерно, что значат цифры в строке Дата Время Тариф Куда звонили Телефон кол-во сек кол-во мин и т.д. 01.06.13 02:37:08 Страйк Исходящий на Билайн +79637436**1 8 01:00 0.35 0.35 Мне нужно среди всего этого многообразия выбрать только номера телефонов и кол-во секунд. Причем, чтобы прога писала, сколько раз на какой номер позвонили, и общее время всех звонков на этот номер. Если сможете помочь буду очень признателен. ps. Все номера начинаются на плюс, и сразу после них через пробел идут секунды +79535392**9 262 примерно так.
Я начал делать вот так
            String src = "01.06.13 00:02:52 Страйк Исходящий на Билайн +79637436911 29 01:00 0.35 0.3501.06.13 00:20:14 БВ Бесплатный входящий +79535392509 262 04:22 0.00 0.0001.06.13 00:25:13 БВ Бесплатный входящий +79535392509 827 13:47 0.00 0.0001.06.13 01:02:01 БВ Бесплатный входящий +79535392509 32 00:32 0.00 0.00";
            string[] result = src.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToArray();
            foreach (string s in result)
                Console.WriteLine(s);
            Console.Read();
Но дальше не знаю, как отделить номера и секунды от всего остального, и посчитать сколько раз и куда звонили. И еще проблема: в переменной src находится уже видоизмененная мной строка, а если вставлять скопированные из файла, то пишет
Ошибка	1	Символ новой строки в константе	c:\users\bujh\documents\visual studio 2012\Projects\ConsoleApplication36\ConsoleApplication36\Program.cs	13	26	ConsoleApplication36
И еще кучу разных ошибок Вставляемый текст вот в таком формате 01.06.13 00:02:52 Страйк Исходящий на Билайн +79637436**1 29 01:00 0.35 0.35 01.06.13 00:20:14 БВ Бесплатный входящий +79535392**9 262 04:22 0.00 0.00 01.06.13 00:25:13 БВ Бесплатный входящий +79535392**9 827 13:47 0.00 0.00 01.06.13 01:02:01 БВ Бесплатный входящий +79535392**9 32 00:32 0.00 0.00 01.06.13 01:29:16 БВ Входящее SMS 900 0 00:00 0.00 0.00 01.06.13 01:29:49 Страйк Исходящий на Билайн +79637436**1 36 01:00 0.35 0.35 01.06.13 01:49:31 Страйк Исходящий на своего +79535392**9 42 01:00 0.35 0.35 01.06.13 01:50:05 Страйк Исходящий на своего +79535392**9 4 01:00 0.35 0.35 01.06.13 01:51:36 БВ Входящее SMS +79535392509 0 00:00 0.00 0.00 01.06.13 01:52:10 Страйк Исходящий на своего +79535392**9 3 00:00 0.00 0.00 01.06.13 02:36:01 Страйк Исходящий на Билайн +79637436**1 17 01:00 0.35 0.35 То есть каждая строка на новой линии, а чтобы программа заработала приходиться делать все строки в одну.
С последней проблемкой разобрался вот так
string src = System.IO.File.ReadAllText(@"C:\WriteText.txt");
Ну же ребят подскажите пожалуйста

Решение задачи: «Как отпарсить текст»

textual
Листинг программы
        struct CallInfo
        {
            //Телефон  Дата Время Тариф Куда звонили  кол-во сек кол-во мин и т.д.
            public string number;
            public DateTime date;
            public string tariff;
            public string typeOfcall;
            public int secCall;// длительность разговора
            public string timeForPayment;//время на оплату
            public string price1;
            public string price2;
        }
 
 
        static List<CallInfo> CallsInfo(string pathFile)
        {
            List<string> stringCalls = File.ReadAllLines(pathFile, Encoding.Default).ToList();
            List<CallInfo> calls = new List<CallInfo>();
            CallInfo callInfo = new CallInfo();
 
            foreach (string stringCall in stringCalls)
            {
                string[] callElements = stringCall.Split();
 
                callInfo.date = DateTime.Parse(callElements[0] + " " + callElements[1]);
                callInfo.tariff = callElements[2];
                callInfo.price2 = callElements[callElements.Length - 1];
                callInfo.price1 = callElements[callElements.Length - 2];
                callInfo.timeForPayment = callElements[callElements.Length - 3];
                callInfo.secCall = Convert.ToInt32(callElements[callElements.Length - 4]);
                callInfo.number = callElements[callElements.Length - 5];
 
 
                callInfo.typeOfcall = string.Empty;
                for (int i = 0; i < callElements.Length; i++)
                {
                    if (i > 2 && i < callElements.Length - 5)
                        callInfo.typeOfcall += callElements[i] + " ";  // извлекаем typeOfcall
                }
 
            calls.Add(callInfo);
           }
            return calls;
 
        }
 
        
        static void Main(string[] args)
        {
            List<CallInfo> calls = CallsInfo(@"D:\PhoneCalls.txt"); // все звонки с разложением на элементы
 
            List<string> listPhone = calls.Select(n => n.number).Distinct().ToList(); // список уникальных номеров
 
            // Дальше бери уникальный номер, находи все его вхождения  в списке звонков (calls)  и смотри, из чего эти звонки состоят
 
            // Например, найдем продолжительность всех исходящих звонков первого номера списка listPhone
 
            int countSecAll=0;
            int countSecOut = 0;
            foreach (CallInfo call in calls)
            {
                if (call.number == listPhone[0])
                {
                    countSecAll += call.secCall;
 
                    if (call.typeOfcall.ToLower().IndexOf("исходящий") != -1) countSecOut += call.secCall;
                }
                
            }
 
            Console.WriteLine("Для номера {0} - общая продолжительность разговоров {1} сек", listPhone[0], countSecAll);
            Console.WriteLine("Из них ИСХОДЯЩИХ на {0}  сек", countSecOut);
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5
Похожие ответы