-
Notifications
You must be signed in to change notification settings - Fork 22
/
Copy pathDate.Parse.pq
94 lines (89 loc) · 2.9 KB
/
Date.Parse.pq
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/**
Improved date parser for strings containing dates in unspecified format.
**/
(datetext as text) =>
let
/* List of enabled locales in order of preference */
Locales = {
null, // system default
"en",
"en-US",
"en-GB",
"ru",
"ru-RU",
"ru-UA",
"ru-BY",
"de",
"de-DE",
"de-BE"
},
/* Common substitutions that turn a string into a readable date */
Substitutions = {
{"года", "г"},
{"год", "г"}
},
/* Try all substitutions listed above and return the first successful result */
TryAllSubstitutions = (datetext as text, reader as function) =>
let
Result = List.Last(
List.Generate(
() => [i=-1, date=null],
each [i] < List.Count(Substitutions),
each [
i = [i] + 1,
date =
if
[date] is null
then
try reader(
Text.Replace(
datetext,
Substitutions{i}{0},
Substitutions{i}{1}
)
)
otherwise null
else
[date]
],
each [date]
)
),
Return =
if Result is null
then error "Could not read date with substitutions: " & datetext
else Result
in
Return,
/* Try all locales listed above and return the first successful result */
TryAllLocales = (datetext as text) =>
let
Result = List.Last(
List.Generate(
() => [i=-1, date=null],
each [i] < List.Count(Locales),
each [
i = [i] + 1,
date =
if
[date] is null
then
try Date.FromText(datetext, Locales{i})
otherwise null
else
[date]
],
each [date]
)
),
Return =
if Result is null
then error "Could not read date with locales: " & datetext
else Result
in
Return,
/* Execute all steps */
CleanDateText = Text.Lower(Text.Trim(datetext)),
Return = TryAllSubstitutions(CleanDateText, TryAllLocales)
in
Return