Jak pobrać wybrane elementy ze stringu do zmiennej

0

Mam taki problem i nie wiem jak się do niego zabrać... Mianowicie mam kilka stringów które mają następującą budowę
string1:

2018-09-01- Rodzaj1

"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."

string2:

2018-10-01- Rodzaj2

"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."

Zarówno ze stringu 1 jak i 2 interesuje mnie zapisanie daty osobno do zmiennej oraz RodzajX do osobnej zmiennej. Niestety nie mam pomysłu jak się dobrać do tego.. Z góry dziękuje za pomoc.

1

wyrazenia regularne?
albo jezeli format jest identyczny w kazdym stringu i wyglada tak jak wyzej to pobierasz 1 linie i dajesz na niej splita z argumentem "- "

2

Może coś takiego

            string costam = @"2018-09-01- Rodzaj1

""Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.""";
            ;
            Regex r = new Regex(@"\d{4}-\d{2}-\d{2}");
            Match m = r.Match(costam);
            if (m.Success)
            {
                DateTime dt = DateTime.ParseExact(m.Value, "yyyy-MM-dd", CultureInfo.InvariantCulture);
                string word = Regex.Match(costam, @"\W(Rodzaj)\W*\d+").Value;
            }

Ewentualnie można dla daty lub innego regexa np. regex

    DateTime dt;
                DateTime.TryParseExact(m.Value, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt);
        
0

@Kubuś Puchatek: Dobrze, tylko do jednej rzeczy muszę się przyczepić ;) Zakładasz, że data w tekście zawsze będzie prawidłowa. Exepction has occur! 😋

0

Co to znaczy prawidłowa data ?

1
Biały Programista napisał(a):

Co to znaczy prawidłowa data ?

W kalendarzu gregoriańskim każdy miesiąc ma określoną liczbę dni i składa się z 12 miesięcy.
Na pewno nieprawidłową datą będzie 2018-06-31, czerwiec ma 30 dni, 1991-14-02 też nie przejdzie. Trzeba również uwzględnić rok przestępny. Przy próbie sparsowania nieprawidłowej daty wyrzuci wyjątek, lepszą opcją będzie skorzystanie z TryParse.

DateTime date;             
if ( DateTime.TryParse(m.Value, out date) )
{
  Console.WriteLine("Data {0}", date);
}
else
{
  Console.WriteLine("Invalid date: {0}.", m.Value);
}
0

Z takiego czegoś korzystają na płatnych portalach randkowych . Sprawdzają czy ktoś nie podał adresu mail lub numeru komórki .
A tak w ogóle to wydaje mi się że w poważnym programie nie powinno być takiej sytuacji żeby trzeba było datę i jakiś tekst wycinać z tekstu,
chyba że sytuacja jak wyżej , hehehe ;)

0

Dziękuje Panowie za wskazówki... co prawda w pierwszym poście źle opisałem jak wygląda string ale zmodyfikowałem to jak umiałem i działa prawie idealnie ale napotkałem na dwa kolejne problemy ;)
Chodzi o to, że string jest jeden i ma kilka dat które chciałbym wyciągnąć z niego + "nagłówek":

2018-09-01- asdas asdasdas sds

"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
string2:

2018-08-01- dhasjdha sakdhsak

"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."

2018-06-01- wwws sakww

"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."


Więc stwierdziłem że najlepiej użyć do tego pętli foreach (string wyciągam ze swojej bazy danych w 3 kolumnie mam właśnie tego stringa):


 while (myReader.Read())
            {
                richTextBox1.Text = myReader[3].ToString();


                System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex(@"\d{4}-\d{2}-\d{2}-\s(.*?)\n");
                
                MatchCollection matches = r.Matches(myReader[3].ToString());
                foreach (Match match in matches)
                {

                    string data = System.Text.RegularExpressions.Regex.Match(match.ToString(), @"\d{4}-\d{2}-\d{2}").Value;
                    string word = System.Text.RegularExpressions.Regex.Match(match.ToString(), @"-\s(.*?)\n").Value;
                    string id = (myReader[1].ToString());

                    MessageBox.Show(data);
                    MessageBox.Show(word);
                    MessageBox.Show(id);
                                    
                }

            }


I teraz działa to idealnie ale kombinuję i nie potrafię się pozbyć ze stringu word "- " czyli myślnika i spacji (czy .Remove wystarczy i określenie dwóch pierwszych znaków .Remove(0, 2) czy jest jakiś inny sposób??). I to jest pierwszy problem - w php było polecenie pregmatch i brało tylko to co w nawiasie odnosząc się do odpowiedniego numeru w tablicy tutaj nie wiem jak to ogarnąć.

Drugi problem na jaki natrafiłem to okazuje się że zapis daty jest w układzie **yyyy-MM-dd ** lub dd.MM.yyyy. I nie bardzo teraz wiem jak ogarnąć wcześniej czy data jest w takim układzie czy innym. Samą zamianę wiem jak wykonać:

data_pozmianie = DateTime.ParseExact(data_przedzmiana, "dd.MM.yyyy", CultureInfo.CurrentCulture).ToString("yyyy-MM-dd");

P.S. Nie to nie jest serwis randkowy to moja baza danych gdzie rozpisuje sobie poszczególne etapy inwestycji: projekt, realizacja etc. I chcę zrobić sobie takie zestawienie ile w danym okresie ile było projektów, ile realizacji, ile mi odpadło... Jestem przedstawicielem a zamiłowania coś tam sobie czasami napisze więc wybaczcie za może durne pytania ;)

1

spróbuj takim regexem wyciągać sobie dane, wtedy nie musisz używać remove

 (?<=- )[\s\w+.-]+

a co do dat możesz tak zrobić

          DateTime dt = new DateTime();
   string[] formats = { "dd.MM.yyyy", "yyyy-MM-dd" };

                DateTime.TryParseExact(data, formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt);

    

1

Idąc dalej oprócz definiowanych przez siebie formatów daty możesz uzykać wszystkie w danej culture metodą

var formats = CultureInfo.CreateSpecificCulture("pl-PL").DateTimeFormat.GetAllDateTimePatterns();

Dla pl-PL będą to:

dd.MM.yyyy
dddd, d MMMM yyyy
d MMMM yyyy
dddd, d MMMM yyyy HH:mm
d MMMM yyyy HH:mm
dddd, d MMMM yyyy HH:mm:ss
d MMMM yyyy HH:mm:ss
dd.MM.yyyy HH:mm
dd.MM.yyyy HH:mm:ss
d MMMM
d MMMM
yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffffffK
yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffffffK
ddd, dd MMM yyyy HH':'mm':'ss 'GMT'
ddd, dd MMM yyyy HH':'mm':'ss 'GMT'
yyyy'-'MM'-'dd'T'HH':'mm':'ss
HH:mm
HH:mm:ss
yyyy'-'MM'-'dd HH':'mm':'ss'Z'
dddd, d MMMM yyyy HH:mm:ss
d MMMM yyyy HH:mm:ss
MMMM yyyy
MMMM yyyy

Jeżeli chcesz dodać niestandardowe formaty dla danej kultury możesz skorzystać z Union.

var formats =  new [] { "yyyyxMMxdd" }.Union(CultureInfo.CreateSpecificCulture("pl-PL").DateTimeFormat.GetAllDateTimePatterns()).ToArray();

Dodaje również fiddle z kodem od kolegi wyżej https://dotnetfiddle.net/NgFYt7 .

0
foreach (var line in lines)
{
    if (line.Contains('-') && line.Where(x => x.Equals('-')).Count() >= 3)
    {
        var split = line.Trim().Split('-');
        Console.WriteLine(split[0]);
        Console.WriteLine(split[1]);
        Console.WriteLine(split[2]);
    }    
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1