2013-02-17 13 views
6

Pracuję nad projektem, w którym czytam plik, który może pochodzić z dwóch różnych formatów, jeden zawiera datę i godzinę, a drugi nie.Ustalenie, czy ciąg znaków zawiera datę i godzinę

Kiedy czytam w pierwszym wierszu, muszę sprawdzić, czy ciąg zawiera datę i godzinę, czy nie i odczytać plik i na podstawie sprawdzenia odczytać plik w określony sposób.

Zgaduję, że byłby to rodzaj wyrażenia regularnego, ale nie mam pojęcia, od czego zacząć i nie można znaleźć niczego istotnego.

Dziękujemy za pomoc.

AKTUALIZACJA Nie sądzę, żebym bardzo jasno wiedział, o co proszę. Kiedy czytam wiersz pliku dziennika po linii linia może przyjść jako:

Col1 Col2 Col3 Col4 Col5 

Czasami linia może przyjść jako

Col1 17-02-2013 02:05:00 Col2 Col3 Col4 Col5 

Kiedy czytam wiersz muszę zrobić sprawdzenie, czy istnieją to ciąg daty i godziny zawarty w ciągu znaków.

+0

można dzielić który co spróbowałeś? – spajce

+0

@Boardy: czy dokładnie wiesz w jakim formacie ustawień datetime daty te będą prezentowane jako? dd-mm-rrrr gg: mm: ss zawsze? –

+0

@ bob-the-destroyer Powinien zawsze mieć format dd-mm gg: mm: ss. Nie sądzę, żeby format się zmienił (proszę zauważyć, że rok nie został uwzględniony). Zapomniałem wspomnieć, że wcześniej – Boardy

Odpowiedz

11

Jeśli format daty zostało zdefiniowane, można użyć wyrażenia regularnego, by go rozwiązać.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Text.RegularExpressions; 

namespace RegTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string testDate = "3214312402-17-2013143214214"; 
      Regex rgx = new Regex(@"\d{2}-\d{2}-\d{4}"); 
      Match mat = rgx.Match(testDate); 
      Console.WriteLine(mat.ToString()); 
      Console.ReadLine(); 
     } 
    } 
} 
+0

Poprawiłem przykłady Regexa nieco – amhed

+0

Dziękuję bardzo za pomoc, bardzo doceniona. – Boardy

5

Aktualizacja 2: Znaleziono przy użyciu DateTime.TryParseExact jest znacznie lepszy sposób, że za pomocą wyrażeń regularnych Wyrażenia

DateTime myDate; 
if (DateTime.TryParseExact(inputString, "dd-MM-yyyy hh:mm:ss", 
    CultureInfo.InvariantCulture, DateTimeStyles.None, out myDate)) 
{ 
    //String has Date and Time 
} 
else 
{ 
    //String has only Date Portion  
} 
+0

Myślę, że OP chce sprawdzić datę i czas :) – scartag

+0

@ scartag: if xdatetime == DateTime.MinValue, to znaczy próba nie powiodła się. Na szczęście jeśli 'DateTime.TryParse (x)' nie powiodło się, zwraca false, więc nie musisz się martwić o to sprawdzanie minvalue. –

+0

Jeśli próba się nie powiedzie, obiekty DateTime pozostaną z wartością domyślną (która jest DateTime.MinValue). – amhed

-2

Ten pracował dla nas:

Jeżeli ciąg znaków jest poprawną wartość datetime, to nie da żadnego wyjątku:

try 
{ 
    Convert.ToDateTime(string_value).ToString("MM/dd/yyyy"); 
} 

Jeżeli ciąg znaków jest niepoprawna wartość datetime, wtedy da wyjątek:

catch (Exception) 
{ 
} 
+0

Mimo że kod jest doceniany, powinien zawsze mieć towarzyszące wyjaśnienie. To nie musi długo potrwać, ale oczekuje się. – peterh

+0

@peterh - zaktualizowany post. – xameeramir

+0

Naprawdę nie rozumiem cię, jeśli zrobiłeś to w sposób, który nie wymaga moich napraw, dostałeś ode mnie ode mnie upomnienie. – peterh

-2

Użyj tej metody, aby sprawdzić, czy ciąg jest data czy nie:

private bool CheckDate(String date) 
{ 
    try 
    { 
     DateTime dt = DateTime.Parse(date); 
     return true; 
    } 
    catch 
    { 
     return false; 
    } 
} 
+2

Mimo że kod jest doceniany, powinien zawsze mieć towarzyszące wyjaśnienie. To nie musi długo potrwać, ale oczekuje się. – peterh

+0

Zanotowałem twoją radę. Dzięki –

0
string s = "Subject: Current account balances for 21st December 2017 
    mnmnm ";//here is u r sample string 

      s = s.ToLower(); 
      string newStrstr = Regex.Replace(s, " {2,}", " ");//remove more than whitespace 
      string newst = Regex.Replace(newStrstr, @"([\s+][-/./_///://|/$/\s+]|[-/./_///://|/$/\s+][\s+])", "/");// remove unwanted whitespace eg 21 -dec- 2017 to 21-07-2017 
      newStrstr = newst.Trim(); 
      Regex rx = new Regex(@"(st|nd|th|rd)");//21st-01-2017 to 21-01-2017 
      string sp = rx.Replace(newStrstr, ""); 
      rx = new Regex(@"(([0-2][0-9]|[3][0-1]|[0-9])[-/./_///://|/$/\s+]([0][0-9]|[0-9]|[1][0-2]|jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec|january|february|march|april|may|june|july|august|september|october|november|december)[-/./_///:/|/$/\s+][0-9]{2,4})");//a pattern for regex to check date format 
      Match m = rx.Match(sp);//look for string satisfy the above pattern regex 
      s = m.ToString();//convert matching data to string 


     DateTime st = Convert.ToDateTime(s);//converting that data 
+0

To będzie trwać z ciągiem w dowolnym stanie –

+0

spojrzeć powyżej kodu i wyjaśnić więcej. –

Powiązane problemy