#!/bin/env python3
from dateutil.parser import parse
from dateutil.tz import tzlocal
from datetime import date as d
import re
import sys
lst = [
["January",
"Januar",
"Januarie",
"??????",
"??",
"sije?anj",
"leden",
"januar",
"januari",
"January",
"tammikuu",
"janvier",
"Januar",
"??????????",
"január",
"gennaio",
"1?",
"1?",
"januar",
"stycze?",
"janeiro",
"ianuarie",
"??????",
"januari",
"január",
"januar",
"enero",
"Ocak",
"??????",
"tháng m?t", ],
["February",
"Februar",
"Februarie",
"????????",
"??",
"velja?a",
"únor",
"februar",
"februari",
"February",
"helmikuu",
"février",
"Februar",
"???????????",
"február",
"febbraio",
"2?",
"2?",
"februar",
"luty",
"fevereiro",
"februarie",
"???????",
"februari",
"február",
"februar",
"febrero",
"?ubat",
"?????",
"Tháng Hai", ],
["March",
"März",
"Maart",
"????",
"??",
"ožujak",
"b?ezen",
"marts",
"maart",
"March",
"maaliskuu",
"mars",
"März",
"???????",
"március",
"marzo",
"3?",
"3?",
"mars",
"marzec",
"março",
"martie",
"????",
"mars",
"marec",
"marec",
"marzo",
"Mart",
"????????",
"di?u hành", ],
["April",
"April",
"April",
"?????",
"??",
"travanj",
"duben",
"april",
"april",
"April",
"huhtikuu",
"avril",
"April",
"????????",
"április",
"aprile",
"4?",
"4?",
"april",
"kwiecie?",
"abril",
"aprilie",
"??????",
"april",
"apríl",
"april",
"abril",
"Nisan",
"???????",
"Tháng T?", ],
["May",
"Mai",
"Mei",
"???",
"??",
"svibanj",
"kv?ten",
"maj",
"mei",
"May",
"saattaa",
"mai",
"Mai",
"?????",
"május",
"maggio",
"5?",
"5?",
"mai",
"maj",
"maio",
"mai",
"???",
"maj",
"máj",
"maj",
"mayo",
"May?s",
"???????",
"có th?", ],
["June",
"Juni",
"Junie",
"???",
"??",
"lipanj",
"?erven",
"juni",
"juni",
"June",
"kesäkuu",
"juin",
"Juni",
"???????",
"június",
"giugno",
"6?",
"6?",
"juni",
"czerwiec",
"junho",
"iunie",
"????",
"juni",
"jún",
"junij",
"junio",
"Haziran",
"???????",
"Tháng Sáu", ],
["July",
"Juli",
"Julie",
"???",
"??",
"srpanj",
"?ervenec",
"juli",
"juli",
"July",
"heinäkuu",
"juillet",
"Juli",
"???????",
"július",
"luglio",
"7?",
"7?",
"juli",
"lipiec",
"julho",
"iulie",
"????",
"juli",
"júl",
"julij",
"julio",
"Temmuz",
"??????",
"Tháng B?y", ],
["August",
"August",
"Augustus",
"??????",
"??",
"kolovoz",
"srpen",
"august",
"augustus",
"August",
"elokuu",
"août",
"August",
"?????????",
"augusztus",
"agosto",
"8?",
"8?",
"august",
"sierpie?",
"agosto",
"august",
"??????",
"augusti",
"august",
"avgust",
"agosto",
"A?ustos",
"???????",
"uy nghi", ],
["September",
"September",
"September",
"?????????",
"??",
"rujan",
"zá?í",
"september",
"september",
"September",
"syyskuu",
"septembre",
"September",
"???????????",
"szeptember",
"settembre",
"9?",
"9?",
"september",
"wrzesie?",
"setembro",
"septembrie",
"????????",
"september",
"septembra",
"september",
"septiembre",
"Eylül",
"????????",
"Tháng Chín", ],
["October",
"Oktober",
"Oktober",
"????????",
"??",
"listopad",
"?íjen",
"oktober",
"oktober",
"October",
"lokakuu",
"octobre",
"Oktober",
"?????????",
"október",
"ottobre",
"10?",
"10?",
"oktober",
"pa?dziernik",
"outubro",
"octombrie",
"???????",
"oktober",
"október",
"oktober",
"octubre",
"Ekim",
"???????",
"Tháng M??i", ],
["November",
"November",
"November",
"???????",
"???",
"studeni",
"listopad",
"november",
"november",
"November",
"marraskuu",
"novembre",
"November",
"?????????",
"november",
"novembre",
"11?",
"11?",
"november",
"listopad",
"novembro",
"noiembrie",
"??????",
"november",
"november",
"november",
"noviembre",
"Kas?m",
"????????",
"Tháng M??i M?t", ],
["December",
"Dezember",
"Desember",
"????????",
"???",
"prosinac",
"prosinec",
"december",
"december",
"December",
"joulukuu",
"décembre",
"Dezember",
"??????????",
"december",
"dicembre",
"12?",
"12?",
"desember",
"grudzie?",
"dezembro",
"decembrie",
"???????",
"december",
"december",
"december",
"diciembre",
"Aral?k",
"???????",
"Tháng m??i hai", ]
]
month_name_map = {}
def prepare(line: str) -> str:
global month_name_map
# first : int[int]....int[int]..intintintint
# second: int[int]<len(whitspace) > 0><non whitespace...><len(whitspace) > 0>intintintint
regex = [
r"([\d]{1,2}).+([\d]{1,2}).+([\d]{4})",
r"([\d]{1,2})[.\s]+([\S]+)[\s]+([\d]{4})",
]
for r in regex:
match = re.search(r, line)
if match:
# these are strings
day = match.group(1)
month = match.group(2)
year = match.group(3)
try:
date = d(year=int(year), month=int(month), day=int(day))
return date.isoformat()
except:
try:
month = month_name_map[month] # January -> 1
date = d(year=int(year), month=int(month), day=int(day))
return date.isoformat()
except:
continue
# no match, return input string
return line
def init_months_names_map():
global month_name_map
# initialize dictionary with every possible capitalization
for idx, month_names in enumerate(lst):
for month in month_names:
number = idx + 1
month_name_map[month] = number
month_name_map[month.lower()] = number
month_name_map[month.upper()] = number
month_name_map[month.capitalize()] = number
month_name_map[month.casefold()] = number
# every possible abbreviation beginning with the first 3 characters
for i in range(3, len(month)):
short_name = f"{month[:i]}." # Mär. Okt. etc.(len = 3), Okto. Oktob, Oktobe.(len [4, 5, 6, ...])
month_name_map[short_name] = number
month_name_map[short_name.lower()] = number
month_name_map[short_name.upper()] = number
month_name_map[short_name.capitalize()] = number
month_name_map[short_name.casefold()] = number
if __name__ == "__main__":
init_months_names_map()
timzone = tzlocal()
# retrieve command line arguments
arguments = sys.argv[1:]
arg_string = " ".join(arguments)
has_args = True if len(arg_string) > 0 else False
lines = [
"das Datum 17. Oktober 2019 mit ausgeschriebenen Monat",
"das Datum 9.5.2019 wird amerikanisch interpretiert (scheint immer dann der Fall zu sein, wenn die fuehrende Null fehlt)",
"das Datum 9.7.2015 wird nicht erkannt (scheint immer dann der Fall zu sein, wenn noch weitere Zahlen in der Zeile vorkommen 0 )",
"12.9.1998",
"12. Sep. 2019",
"13. Okt. 2019",
"14. Mär. 2019"
]
#with open('/volume1/DEV/datetest.txt', 'r') as lines:
for txt in lines:
try:
dt = parse(prepare(txt), fuzzy=True, tzinfos=[timzone])
except ValueError:
print("\t\t\tERROR, unknown format:", txt)
else:
print(dt.date())