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 18 godzin
  • Postów:1595
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:ponad 6 lat
  • Ostatnio:około rok
  • 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:około 18 lat
  • Ostatnio:8 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:ponad 6 lat
  • Ostatnio:około rok
  • 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:około 18 lat
  • Ostatnio:8 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 18 godzin
  • Postów:1595
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 9 godzin
  • Lokalizacja:Tuchów
  • Postów:12154
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:ponad 6 lat
  • Ostatnio:około rok
  • 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 9 godzin
  • Lokalizacja:Tuchów
  • Postów:12154
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. ;)
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)