Как отпарсить текст - 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 примерно так.
Но дальше не знаю, как отделить номера и секунды от всего остального, и посчитать сколько раз и куда звонили.
И еще проблема: в переменной src находится уже видоизмененная мной строка, а если вставлять скопированные из файла, то пишет И еще кучу разных ошибок
Вставляемый текст вот в таком формате
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 = "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();
Ошибка 1 Символ новой строки в константе c:\users\bujh\documents\visual studio 2012\Projects\ConsoleApplication36\ConsoleApplication36\Program.cs 13 26 ConsoleApplication36
С последней проблемкой разобрался вот так
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); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д