Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Cu ce va aparati de cainii agresi...

Nu imi platiti coletul cu cardul ...

Mi-au disparut amigdalitele ?

Exista vreun plan de terorizare p...
 Schimbare adresa DNS IPv4 pe rout...

Recomandare Barebone

Monede JO 2024

Suprasolicitare sistem electric
 CIV auto import

Mutare in MOZAMBIC - pareri, expe...

Scoatere antifurt airtag de pe ha...

Magnet in loc de clește pent...
 Cumparat/Locuit in apartament si ...

Pot folosi sistemul PC pe post de...

Sokol cu distorsiuni de cross-over

Filtru apa potabila cu osmoza inv...
 

Cum as putea converti o data din orice posibil format intr-un format dat.

- - - - -
  • Please log in to reply
13 replies to this topic

#1
ursudepadure

ursudepadure

    Junior Member

  • Grup: Members
  • Posts: 232
  • Înscris: 28.04.2012
Exista diferite formate pentru data, cele mai populare fiind:
"dd/MM/yyyy",   "dd MMMM yyyy" ,  "dd mm yyyy"
Sa fac conversia dintr-un format dat in altul e este simplu:

   private string convertus(string posibledate) // THIS FUNCTION CONVERT FOR US FORMAT
  {
   string stringDate = posibledate;
   var dt = DateTime.ParseExact(stringDate, "MMMM dd yyyy", CultureInfo.InvariantCulture).ToString("MM/dd/yyyy");
   return dt;
}

Asadar fiind format US pentru azi va fi October 31 2021 convertita in 10/31/2021, merge brici.
Totul e OK dar trebuie sa stiu dinainte formatul datei , ca in cazul de sus. Eu am insa o lista cu diferite formate, poate fi unul din cele din area de stringuri de mai sus sau altele acceptate.
Cum as putea sa fac conversia in formatul  "MM/dd/yyyy" din orice format posibil ?'
Ca sa determin daca este US sau GB am facut asa:

private bool isGbDate(string posibledate) // testeaza daca e EU format (GB, ca trebuie sa fie in engleza).
   {
    string[] formats = { "dd/MM/yyyy",   "dd MMMM yyyy" ,  "dd mm yyyy" };
    string dateTime = posibledate;
    DateTime parsedDateTime;
   if (DateTime.TryParseExact(dateTime, formats, new CultureInfo("en-GB"),
    DateTimeStyles.None, out parsedDateTime) == false)
    { return false; }  // it is the place where I write the code for the other culture
   else
    { return true; }
   }


  private bool isUsDate(string posibledate) //Testeaza daca e US format
   {
    string[] formats = { "MM/dd/yyyy", "MMMM dd yyyy", "yyyy mm dd" };
    string dateTime = posibledate;
    DateTime parsedDateTime;
    if (DateTime.TryParseExact(dateTime, formats, new CultureInfo("en-US"),
DateTimeStyles.None, out parsedDateTime) == false)
    { return false; }  // it is the place where I write the code for the other culture
    else
{ return true; }
   }

Ma gandea sa aplic aceeasi figura si la conversie:
            string[] formats = { "MM/dd/yyyy", "MMMM dd yyyy", "yyyy mm dd" }; // POT FI MULT MAI MULTE ASTA NU E O PROBLEMA
            var dt = DateTime.ParseExact(stringDate, formats, CultureInfo.InvariantCulture).ToString("MM/dd/yyyy");
           in loc de cazul particular :
           var dt = DateTime.ParseExact(stringDate, "MMMM dd yyyy", CultureInfo.InvariantCulture).ToString("MM/dd/yyyy");

      Se pare ca nu merge. As putea sa fac ditamai functia sa imi determine ce format este din cateva mai "populare" dar poate exista o cale mai simpla, cum ar fi sa am un area de stringuri ca mai sus. Ar putea cineva sa imi dea un sfat?

#2
LukRo

LukRo

    Active Member

  • Grup: Members
  • Posts: 1,851
  • Înscris: 23.10.2015
Trebuie impus un standard de intrare. Niciodata nu vei sti daca 03/04/2021 este 3-Apr-21 sau 4-Mar-21.

#3
viotl

viotl

    Straight ahead ... middle of the road

  • Grup: Senior Members
  • Posts: 10,552
  • Înscris: 03.04.2013
Nu ma pricep la cod, dar atat cat ma pricep: de ce ai face asta?
Vrei sa-ti recunoasca secventa ta data dintr-un text sau vrei ca, daca utilizatorii unui tabel template tasteaza data in orice format, tabelul sa converteasca la formatul dorit de tine?

 LukRo, on 31 octombrie 2021 - 22:45, said:

Trebuie impus un standard de intrare. Niciodata nu vei sti daca 03/04/2021 este 3-Apr-21 sau 4-Mar-21.
Cam aici voiam sa ajung si eu....
Dar inca nu stim ce vrea colegul.
Cred ca simpla pozitionare a cursorului pe campul respectiv, sau tastarea unui format nerecunoscut sa genereze un pop up cu instructiuni asupra formatului.

Edited by viotl, 31 October 2021 - 22:49.


#4
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,441
  • Înscris: 10.08.2005

 ursudepadure, on 31 octombrie 2021 - 21:48, said:

Exista diferite formate pentru data, cele mai populare fiind:
"dd/MM/yyyy",   "dd MMMM yyyy" ,  "dd mm yyyy"
Sa fac conversia dintr-un format dat in altul e este simplu:
Dar de unde vin aceste date?
DateTimeFormatInfo
https://docs.microso...fo?view=net-5.0
https://docs.microso...otnet-framework

Edited by MarianG, 31 October 2021 - 23:08.


#5
ursudepadure

ursudepadure

    Junior Member

  • Grup: Members
  • Posts: 232
  • Înscris: 28.04.2012
Am niste articole stiintificce. Am resusit sa creez un folder cu prima pagina a fiecarui articol care contine data in care au fost pulished,, submitted sau received, Aceste data sunt mult mai aproape de "adevar" decat metadata care contine "date of creation" (fisierele cu articole erau pdf). Ca sa nu o lungesc cel cu care lucrez vera sa faca niste cercetari si printere altele are nevoie de aceste date pentru un grafic.
Ce am obtinut eu e ceva de genul:
2016 10 03
   00000000
   00000000
29 APRIL 2015
6 NOVEMBER 2013
24 FEBRUARY 2015
12 34 1999
2000-12-11
00000000 inseamna ca nu am gasit date in fisier si nu am avut ce extrage. Eventual acolo sa introduc metadata cu "date of creation" sau cum o vrea el.
Am reusit sa detectez cu codul de mai sus daca data este US sau EU. Dar fiecare autor a pus data cum l-a taiat capul. Unii din US altii din EU cu toate formatele posibile desi predomina
"dd MMM yyyy".
Mie mi se cere ca pentru fiecare fisier data sa fie reprezentata la fel pentru ca pe grafic, pe abscina nu pot aparea tot felul de formate ca nu da bine.
Va trebui sa fie un singur format, cat mai simplu, eventual yyyy,dd,mm
Datele respective sunt acum intr-un fisier text. Este de fapt o singura coloana cu cateva mii de valori. Adica date reprezentate in diferite formate.
Cum functia de convertire presupune sa stiu cum arata data pe caz general(nu pot sa o introduc direct) atunci eu trebuie sa fac ceva sa transform sa zicem stringul "01 february 2021" in
stringul "dd MMM yyyy",  Pentru a afla daca este US sau EU am putut introduce din start toate formatele posiblle sum se vede mai sus (nu sunt toate dar pot sa mai adaug tot ce exista,
Cred ca va trebui sa scriu o functie. Am idee deja cum sa o fac dar e mult de scris.

 LukRo, on 31 octombrie 2021 - 22:45, said:

Trebuie impus un standard de intrare. Niciodata nu vei sti daca 03/04/2021 este 3-Apr-21 sau 4-Mar-21.
Daca te referi la faptul ca este US sau EU, nu este o problema cu codul de mai sus. Asta pentru ca eu specific clar tara, daca te uiti este :

if (DateTime.TryParseExact(dateTime, formats, new CultureInfo("en-GB"),
DateTimeStyles.None, out parsedDateTime) == false)
Poate fi desigur orice limba. Atunci eu stiu daca 3-Apr-21 sau 4-Mar-21 este EU sau US. GB in cazul asta inseamna Great Britain. Daca era "fr-FR", era franceza. Deci nu exista dubii in privinta asta.
Doar ca nu pot sa fac conversia daca nu stiu formatul pe caz general.

var dt = DateTime.ParseExact(stringDate, "MMMM dd yyyy", CultureInfo.InvariantCulture).ToString("MM/dd/yyyy");
va converti orice dafa din formatul de sus, cum ar fi November 01 2021 in 11/01/2021. Sa inversez apoi cel american cu cel european stiu sa fac odata ce am datele.
Ma apuc acum sa scriu o functie, am niste idei, sa vad ce va iesi.

Edited by ursudepadure, 01 November 2021 - 09:35.


#6
ursudepadure

ursudepadure

    Junior Member

  • Grup: Members
  • Posts: 232
  • Înscris: 28.04.2012
Pe scurt: in loc de cazul particular:
var dt = DateTime.ParseExact(stringDate, "MMMM dd yyyy", CultureInfo.InvariantCulture).ToString("MM/dd/yyyy");

Sa am ceva care sa cuprinda toate formatele, sau care cred eu ca imi sunt mai utile (in articole nu am gasit cele in care anul apare din doua cifre).
var dt = DateTime.ParseExact(stringDate, diferiteformate, CultureInfo.InvariantCulture).ToString("MM/dd/yyyy");
string[] diferiteformate = { "MM/dd/yyyy", "MMMM dd yyyy", "yyyy mm dd", ...cate vreau eu ... }

desigur data extrasa care trebuie convertita se alfa in stringul  numit stringDate in aceasta instructiune, dar instructiunea asta nu stie sa ii extraga formatul pe caz general.

#7
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,441
  • Înscris: 10.08.2005
Pai daca unii din US si altii din EU, vezi manual cine si unde a publicat.
Altfel munca de cercetare n-ar fi frumosa.
Ai indoieli pentru datele care au atat luna cat si ziua sub 13, daca ai 12/13 sau 13/10 iti dai seama care si ce reprezinta.

#8
ursudepadure

ursudepadure

    Junior Member

  • Grup: Members
  • Posts: 232
  • Înscris: 28.04.2012

 MarianG, on 01 noiembrie 2021 - 10:56, said:

Pai daca unii din US si altii din EU, vezi manual cine si unde a publicat.
Altfel munca de cercetare n-ar fi frumosa.
Ai indoieli pentru datele care au atat luna cat si ziua sub 13, daca ai 12/13 sau 13/10 iti dai seama care si ce reprezinta.
E vorba aici de GB de .pdf files. Eu am reusit sa caut prin ele dupa cuvinte sau fraze (nu e usor sa gasesti o conversie pdf to txt moca). Acum eu fac ceva care in mod "barbar" ar putea fi considerat "data mining". Cu alte cuvinte caut tag-words cu care pot sa extrag sa zicem data, keywords (desigur, unde exista).
Este foarte usor sa testezi (ceva if-uri pe acolo) daca e intr-o anumita limba sau alta asa cum am afisat codul de mai sus. Eu acuma sunt frustrat ca nu pot sa inlocuiesc direct cazurile generale cu cele partirulare. Evident e clar ca poti sa scrii o functie. Acuma, depinde de cel cu care lucrez, daca este o prioritate. Am o idee dar nu stiu daca o sa fie cea mai buna. Daca da, atunci raspund singur la intreabarea pe care am eu am intrebat-o. Suna ciudat...

#9
ursudepadure

ursudepadure

    Junior Member

  • Grup: Members
  • Posts: 232
  • Înscris: 28.04.2012
Nu vad prea mult "feed back". (asta e o englezoromana cumplita, dar nu stiu cum sa ii zic). Ce nu au inteles unii, este ca aici este vorba de mii de fisiere, nu doar cate unul. Eu fac un "loop" prin care trec toate fisierele dintr-un folder. Pot fii de ordinul miilor.
Asta nu conteaza. Eu am extras toate datele (adica in limba romana ma refer la timp) acolo unde existau inaintea unor cuvinte  care m-au ajutat ca niste tags in html.
Problema mea este doar conversia.. Este interesant ca am gasit o functie care stie daca un string este sau nu o data calendaristica (daca nu iti da un mesaj ca nu e Gregorian ;) ).
Si cum vedeti mai sus poate sa "zica" daca e US sau GB. Dar merge pentru orice limba.  Sa fiu cinstit am ramas uimt ca MS a facut asta pentru developers.

#10
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,441
  • Înscris: 10.08.2005
Articolele stiintifice (de regula) au o noima; in cazul tau, conseventa formatului de afisare a datelor calendaristice.
Tu trebuie doar sa te decizi daca pentru documentul in cauza este zi/luna sau luna/zi.
Daca aceste date calendaristice deja sunt extrase, "basically, you're screwed".

#11
ursudepadure

ursudepadure

    Junior Member

  • Grup: Members
  • Posts: 232
  • Înscris: 28.04.2012

 MarianG, on 03 noiembrie 2021 - 09:02, said:

Articolele stiintifice (de regula) au o noima; in cazul tau, conseventa formatului de afisare a datelor calendaristice.
Tu trebuie doar sa te decizi daca pentru documentul in cauza este zi/luna sau luna/zi.
Daca aceste date calendaristice deja sunt extrase, "basically, you're screwed".
Eu le-am extras, indiferent de format dar trebuie sa le convertesc pe toate in ceva de genul yyyy.mm.dd pentru a se putea face un grafic unde abscisa este data. Daca formatele sunt diferite, atunci graficul nu poate fi obtinut. Pe ordonata am tot felul de chestii (de fapt sunt mai multe grafice in care am nevoie de acest format).  Daca as vrea doar sa extrag data, nu ar fi nimic, dar indiferent de format eu trebuie sa o fac yyyy.mm,dd.  Inca nu am avut timp. Banuiesc ca o sa o fac dar ma gandeam ca poate e o cale mai simpla.

#12
ursudepadure

ursudepadure

    Junior Member

  • Grup: Members
  • Posts: 232
  • Înscris: 28.04.2012
Pana la urma am dres-o. Nu chiar de tot, mai sunt formate buclucase. Dar cam 99.9 %. Daca cineva are nevoie poate ca il ajuta.

// DATELE EXTRASE "BARBAR" DUPA DIFERITE CRITERII, DIN FISIERE TEXT (REZULTATE DIN PDF)
// INTRODUSE IN FISIERUL TEXT "extractedateonly.txt", DACA NU EXISTA DATA DE EXTRAS, PUNE 0000.00.00

string textfile = @"C:\wf\ExtractedMD\extractedateonly.txt";
string[] dates = File.ReadAllLines(textfile); // FIECARE LINIE DIN FISIER E O DATA IN ACEST CAZ IN AREA NUMITA dates


   string[] formattedDates = new string[dates.Length];
   string[] formats = { "M/d/yyyy", "d/M/yyyy", "M-d-yyyy", "d-M-yyyy", "d-MMM-yy", "d-MMMM-yyyy", "d MMMM yyyy", "MMMM d yyyy", "d M yyyy" ,
    "d M yyyy", "yyyy M d", "dth M d", "M d yyyy" , "yyyy MM d","yyyy MM dd", "yyyy MMMM d", "MMM dd yyyy"};
  for (int i = 0; i < dates.Length; i++)
   {
    DateTime date;
    if (DateTime.TryParseExact(dates[i], formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
{ formattedDates[i] = date.ToString("yyyy.MM.dd"); } // DE FORMATUL ASTA E NEVOIE
    else
{ formattedDates[i] = date.ToString("0000.00.00"); } // DACA NU EXISTA DATA EXTRASA
    File.AppendAllText(@"C:\wf\ExtractedMD\dataconverted.txt", formattedDates[i]+"\n");
   }
Problema este ca nu gasesc ceva pentru date de genul: 3TH NOV 2012.
E clar ca MMMM e luna scrisa lung, MMM pe scurt, MM ca si numar, etc...sunt niste reguli.
Nu am gasit inca aceea cu "th dar, poate nu am cautat destul.


#13
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,441
  • Înscris: 10.08.2005
nu exiata 3TH ci 3rd

#14
ursudepadure

ursudepadure

    Junior Member

  • Grup: Members
  • Posts: 232
  • Înscris: 28.04.2012

 MarianG, on 10 noiembrie 2021 - 06:53, said:

nu exiata 3TH ci 3rd
Exista, desi poate e gresit. Nici englezii nu stiu. Problema este ca eu am gasit in fisierele mele ddth. Adica 11th Sept 2001 sau cand a fost...
Acum am trecut la altceva dar va trebui sa revin la asta, atata timp cat sunt date in formatul asta. Desigur ca pot face o functie, dar e mult de scris, as fi fost bucuros sa existe formatul asta....
Well, am vazut ca aici e o intreaga teorie cu datele. Eu am nimerit-o dar probabil ca se pot face multe lucruri fara sa te apuci sa scrii functii de nebun.

Anunturi

Chirurgia cranio-cerebrală minim invazivă Chirurgia cranio-cerebrală minim invazivă

Tehnicile minim invazive impun utilizarea unei tehnologii ultramoderne.

Endoscoapele operatorii de diverse tipuri, microscopul operator dedicat, neuronavigația, neuroelectrofiziologia, tehnicile avansate de anestezie, chirurgia cu pacientul treaz reprezintă armamentarium fără de care neurochirurgia prin "gaura cheii" nu ar fi posibilă. Folosind tehnicile de mai sus, tratăm un spectru larg de patologii cranio-cerebrale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate