2013-06-13 6 views
0

Я использую сетевое приложение DOTNET, в котором у меня есть столбец журнала в базе данных. Всякий раз, когда пользователь добавляет комментарии в комментарии textarea в пользовательском интерфейсе, дату, его имя вместе с комментарием прилагается к существующим данным в базе данных. Ниже приведен формат, в котором столбец содержит данные:Получите все даты из строки в C#

04/05/11 17:10:19 (user2):Work Log - 
Closing. 
03/31/11 09:40:02 (user2):Work Log - 
Support provided over phone. 
03/31/11 09:39:43 (user1):Work Log – 
Awaiting support reply 
03/30/11 11:30:08 (user2):Work Log - 
Manager notified by standard e-mail communication. 
03/30/11 11:29:30 (user1):Work Log - 
Emailed support team 
03/30/11 11:28:52 (user1):Work Log - 
I have an issue with my Xbox. 

Я пытаюсь тянуть в настоящее время все даты (только даты), когда эти замечания будут введены. Я пробовал много вариантов, но никто не помогал.

+0

Разве это не выпрашивая 'fldDateTime | fldUser | fldMessage' –

+0

вы извлечения его в качестве одной огромной строки или это одна строка за комментарий? Что именно вы пробовали? Как насчет приема подстроки первых 17 символов в каждой строке? – StaWho

+0

@StaWho Я получаю полную строку за один раз, я не могу идти чередующимися строками, так как есть вероятность, что комментарий может быть многострочным. – TRR

ответ

2

Предполагая, что вы хотите сделать это в C# код:

Regex splitter = new Regex("[0-9]{2}/[0-9]{2}/[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}"); 
foreach (Match m in splitter.Matches(theDatabaseValue)) { 
    string dateString = m.Groups[0].Value; 
    DateTime dt = DateTime.ParseExact(dateString, "MM/dd/yy HH:mm:ss", null); 
} 

Хорошая вещь о регулярных выражений подхода заключается в том, что вы можете расширить его и извлечь пользователя:

Regex splitter = new Regex("(?<date>[0-9]{2}/[0-9]{2}/[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}) \\((?<user>.+)\\)"); 
foreach (Match m in splitter.Matches(theDatabaseValue)) { 
    string dateString = m.Groups["date"].Value; 
    DateTime dt = DateTime.ParseExact(dateString, "MM/dd/yy HH:mm:ss", null); 
    string user = m.Groups["user"].Value; 
    Console.WriteLine("{0} {1}", dt.ToString(), user); 
} 

и, следовательно, даже сообщение (я не делал эту часть регулярного выражения, поскольку я не уверен, что у вас есть разрывы строк перед сообщением или нет, похоже, что вы это делаете).

Как только вы это сделаете, вы можете создать таблицу базы данных, в которой есть три столбца, дата, пользователь, комментарий, а затем преобразовать существующую таблицу в другую с помощью регулярного выражения и сделать вашу жизнь в будущем намного проще!

+0

исправленный формат даты в коде: это месяц/день/год в соответствии с образцом OP –

+0

Работает как шарм ... использование регулярного выражения - это только вариант, оставшийся теперь для меня. Большое спасибо Andy – TRR

0

Вы должны реорганизовать свою базу данных для хранения данных в трех столбцах (DateTime, User, Comment), это значительно улучшит производительность и удобство использования.

Но если это не вариант, вы можете использовать DateTime.TryParse, чтобы получить значение из строки. Например:

 string comment = "04/05/11 17:10:19 (user2):Work Log - Closing."; 

     string dateSection = comment.Substring(0, 17); 

     DateTime date; 

     if (!DateTime.TryParse(dateSection, out date)) 
     { 
      throw new Exception(string.Format("unable to parse string '{0}'", dateSection)); 
     } 
Смежные вопросы