Rozpoznawanie formatu wejściowego daty (Delphi XE2)

Rozpoznawanie formatu wejściowego daty (Delphi XE2)
TO
  • Rejestracja:prawie 20 lat
  • Ostatnio:ponad 4 lata
0

Mam plik wejściowy, w którym w zależności od tego kto na jakim komputerze wygenerował plik - będę miał inny format daty.

Czy poza ręcznym sprawdzaniem jaki jest separator, liczeniem znaków i zakładaniem, że pierwsza para jest dniem, a druga miesiącem (założenie, że nie mamy do czynienia z data w formacie amerykańskim - program działa na terenie polski) - jest jakieś cuś, co potrafi "domyśleć" się aktualnego formatu daty ?

Jest duża szansa, że formatowania dat będą typowo polskie tj: dd-MM-yyyy, dd.MM.yyyy albo yyyy-MM-dd.

Mogę to rzeźbić ręcznie - ale pytanie czy ktoś może już brnął przez taki temat i może zwrócić uwagę na coś, czego ja w tej chwili nie wziąłem pod uwagę.

woolfik
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 12 godzin
  • Postów:1597
0

Jak rozumiem plik wejściowy ma datę w postaci stringa tak? Jeśli tak to masz funkcję: TryStrToDate, która zwróci Ci true jeśli uda jej się przekonwertować string na datę

edytowany 1x, ostatnio: woolfik
AK
  • Rejestracja:prawie 7 lat
  • Ostatnio:około miesiąc
  • Postów:3561
0

Rzeźbienie w brązowym.
Nie możesz ustabilizować programu produkującego dane?


Bo C to najlepszy język, każdy uczeń ci to powie
TO
  • Rejestracja:prawie 20 lat
  • Ostatnio:ponad 4 lata
0

W sumie racja - mogę przecież spróbować "typowych" konfiguracji i użyć tej, która się nie wywali (da true).

Dzieki.

AnyKtokolwiek napisał(a):

Rzeźbienie w brązowym.
Nie możesz ustabilizować programu produkującego dane?

Nope. Nie mam na to wpływu.

edytowany 2x, ostatnio: toyman
AK
Ach, ta Polaczkowa informatyzacja, co trzeci to miszcz Excella (a ten pozostały to lekarz / ekspert od katastrof lotniczych)
TO
Z całym szacunkiem, ale zachowaj takie komentarze dla siebie. Nie wnosi to nic do sprawy.
robertz68
  • Rejestracja:ponad 18 lat
  • Ostatnio:3 dni
  • Lokalizacja:Zielona Góra
2

Ciekawe co zrobisz jak dostaniesz dane w formie 07-05-2020 z komputera z kalendarzem amerykańskim, czyli miesiąc-dzień-rok?
Założysz że to 7 maj a będzie to 5 lipiec.
Tak nie powinny działać aplikacje.

AK
Lub dwucyfrowy rok. Niestety, "się zapomniało" o 2000 ...
TO
  • Rejestracja:prawie 20 lat
  • Ostatnio:ponad 4 lata
0
robertz68 napisał(a):

Ciekawe co zrobisz jak dostaniesz dane w formie 07-05-2020 z komputera z kalendarzem amerykańskim, czyli miesiąc-dzień-rok?
Założysz że to 7 maj a będzie to 5 lipiec.
Tak nie powinny działać aplikacje.

Dlatego pytam czy jest coś, co umie to zrobić z automatu. Sądzę, że zauważyłeś, że wziąłem to pod uwagę i na tą chwilę jedyne co mogę zrobić to założenie, że wiem, że jest to odpalane w Polsce, w teorii na maszynach z polskim systemem operacyjnym.

Albo inaczej. Stwierdzeniem oczywistości niewiele pomogłeś.

AK
  • Rejestracja:prawie 7 lat
  • Ostatnio:około miesiąc
  • Postów:3561
0

A zdradż, co za wybitny program produkuje te dane?


Bo C to najlepszy język, każdy uczeń ci to powie
TO
Ale zrozum. Nie ma to żadnego znaczenia dla sprawy. Jest konkretny problem, który trzeba rozwiązać. Jakoś. Wszystko o czym teraz dyskutujesz jest pustą i jałową dyskusja o niczym.
robertz68
  • Rejestracja:ponad 18 lat
  • Ostatnio:3 dni
  • Lokalizacja:Zielona Góra
0

Akurat nie powinieneś zakładać że lokalizacja jest prawidłowo ustawiona. Jeśli dane pochodzą z jakiejś korporacji to często komputery ustawiane są powiedzmy globalnie.
Wg mnie są dwa rozwiązania:

  1. sprawdź jak wyglądają eksportowane dane, być może jest to robione na bieżąco i będzie mała szansa na otrzymanie danych np. starszych niż kilkudniowe.
  2. być może w danych jest jakiś znacznik który mówi który komputer je eksportuje, jeśli tak to zrób słownik takich komputerów i przypisz, nawet ręcznie odpowiednie formatowanie daty do komputera.

Drugie rozwiązanie wydaje mi się dość skuteczne.

TO
Dane są w formacie CSV. W zależności od tego na jakiej maszynie zostaną wygenerowane - plik może mieć jedno, drugie, trzecie albo bóg wie jakie formatowanie. Nie mam wpływu na to jak to jest generowane. Nie mogę zmusić dostawcy oprogramowania po drugiej stronie, żeby narzucił format daty. Wiem tylko, że w ramach jednego pliku data będzie jednakowa (co niewiele poprawa sytuację) i zakładam, że będzie polska.
TO
  • Rejestracja:prawie 20 lat
  • Ostatnio:ponad 4 lata
0

Dobra panowie. za klasykiem: "szkoda strzępić ryja". Mam "drutowane" rozwiązanie i tyle musi teraz wystarczyć.

Dziękuję wszystkim za zainteresowanie i zaangażowanie. Wątek można zamknąć.

woolfik
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 12 godzin
  • Postów:1597
0

Ogólnie temat daty nie jest prosty ... projekt, w którym obecnie biorę udział łączy kompy z linuxem, kompy z windowsem oraz sprzęt i np sprzęt aktualizuje czas z czasem serwera bazy danych, a ten z gps ale w UTC i przekazanie czasu do kompów powodowało "rozjazdy" także niestety każdy taki problem trzeba rozwiązywać indywodualnie. W delphi jest też funkcja, która konwertuje datę do UTC więc możesz też na tym operować ;)

vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
1

Zaloz ze masz na wejsciu najbardziej zlosliwa date czyli 07.07.07
Teraz w zaleznosci od liczby rekordow albo Ci sie uda z tego wybrnac albo nie.
Jesli jest ich duzo to pewnie trafia sie daty po 12-tym dniu miesiaca i z roku > 2012.

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 7 godzin
  • Lokalizacja:Tuchów
  • Postów:12172
0

@toyman: a czy chociaż znasz zakres możliwych formatów, czy ten plik to po prostu czarna skrzynka z datami w kompletnie nieznanym/losowym formacie, z której musisz wręcz wyczarować poprawne daty? Druga sprawa – czy znasz zakres wartości tych dat (np. przedział od 2010 do 2020), czy znów jest to totalnie niewiadome?

Ogólnie to trudno napisać kod, który zagwarantuje Ci pełną poprawność konwersji.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 1x, ostatnio: flowCRANE
TO
Napisałem, że zakładam, że są to daty w formacie polskim - ponieważ aplikacja generująca jest używana na komputerach z polskim systemem operacyjnym. Na razie jest to ogarnięte TryStrToDate dla trzech formatów: dd.mm.yyyy, dd-mm-yyyy i yyyy-mm-dd - takie, jakie do tej pory występowały. Ten, który zwróci True - dokleja kawałek SQLa z odpowiednim formatowaniem daty.
flowCRANE
To że użytkownicy mają polski system, wcale nie oznacza, że mają ustawione polskie formaty – te można w dowolnym momencie zmienić w ustawieniach regionalnych systemu. No ale takie założenie znacznie ogranicza zakres możliwych formatów, więc na plus.
AK
  • Rejestracja:prawie 7 lat
  • Ostatnio:około miesiąc
  • Postów:3561
2

Napisałem, ... dokleja kawałek SQLa z odpowiednim formatowaniem daty. - toyman 26 minut temu

W bazie danych **też ** masz patologię?
To jest chore, co piszesz.


Bo C to najlepszy język, każdy uczeń ci to powie
edytowany 1x, ostatnio: AnyKtokolwiek
TO
Wyciągasz zbyt daleko idące wnioski próbując na siłę rzucać błotem. Po co ? W bazie mam jakieś formatowanie. Jedno. Ustalone. Stałe. Problemem jest plik wejściowy, przez którego zawartość niezgodną z formatowaniem DB - dostaję błędy SQL o niezgodnym formatowaniu daty. Tyle. Uspokój się. Świat nie jest czarno-biały. Czasem nie warto się masturbować z idealnymi rozwiązaniami, a zrobić robotę i iść dalej.
AK
"W bazie mam jakieś formatowanie. Jedno. Ustalone. Stałe. " widzę, że nie rozumiesz
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 7 godzin
  • Lokalizacja:Tuchów
  • Postów:12172
0

Sugeruję napisać sobie proste narzędzie, które przetrawi ten plik i sporządzi statystyki, dzięki czemu będziesz wiedział na czym stoisz przed aktualizacją docelowej bazy danych. Sprawdź ile dat można przekonwertować i ile nie, jakie są zakresy dat, ile jest tych, które da się przekonwertować, ale nie da się rozpoznać w jakim są formacie (np. 05.05.05) itd. Czyli najpierw analiza i rozeznanie w temacie.

Jak już będziesz wiedział jak sprawy się mają to wtedy dobierze się odpowiednie rozwiązanie.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 1x, ostatnio: flowCRANE
TO
Ehhhh. Nie czytasz uważnie. Napisałem już, że do tej pory występowały trzy, które wymieniłem i wszystkie dotyczą polskiego formatowania daty. Jak wystąpią kolejne, o których istnieniu na razie nie wiem - czyli będzie jak piszesz - ktoś użyje niepolskiego formatowania daty - dostanę błąd i będę reagował. W tej chwili stosuję zasadę 20/80 - a właściwie 3/100 (trzy typy dat rozwiązują aktualne 100% przypadków).
flowCRANE
W takim razie nie wiem po co ten wątek, skoro wszystko wiesz i da się osiągnąć 100% zgodności bez żadnych czarów. ;)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.