mirror of
https://github.com/simonw/sqlite-utils.git
synced 2026-07-25 18:34:32 +02:00
errors=r.SET_NULL/r.IGNORE options for parsedate/parsedatetime, closes #416
This commit is contained in:
parent
433813612f
commit
878d5f5cea
6 changed files with 108 additions and 20 deletions
|
|
@ -2583,12 +2583,16 @@ def _generate_convert_help():
|
|||
"""
|
||||
).strip()
|
||||
recipe_names = [
|
||||
n for n in dir(recipes) if not n.startswith("_") and n not in ("json", "parser")
|
||||
n
|
||||
for n in dir(recipes)
|
||||
if not n.startswith("_")
|
||||
and n not in ("json", "parser")
|
||||
and callable(getattr(recipes, n))
|
||||
]
|
||||
for name in recipe_names:
|
||||
fn = getattr(recipes, name)
|
||||
help += "\n\nr.{}{}\n\n {}".format(
|
||||
name, str(inspect.signature(fn)), fn.__doc__
|
||||
help += "\n\nr.{}{}\n\n\b{}".format(
|
||||
name, str(inspect.signature(fn)), fn.__doc__.rstrip()
|
||||
)
|
||||
help += "\n\n"
|
||||
help += textwrap.dedent(
|
||||
|
|
|
|||
|
|
@ -1,19 +1,56 @@
|
|||
from dateutil import parser
|
||||
import json
|
||||
|
||||
|
||||
def parsedate(value, dayfirst=False, yearfirst=False):
|
||||
"Parse a date and convert it to ISO date format: yyyy-mm-dd"
|
||||
return (
|
||||
parser.parse(value, dayfirst=dayfirst, yearfirst=yearfirst).date().isoformat()
|
||||
)
|
||||
IGNORE = object()
|
||||
SET_NULL = object()
|
||||
|
||||
|
||||
def parsedatetime(value, dayfirst=False, yearfirst=False):
|
||||
"Parse a datetime and convert it to ISO datetime format: yyyy-mm-ddTHH:MM:SS"
|
||||
return parser.parse(value, dayfirst=dayfirst, yearfirst=yearfirst).isoformat()
|
||||
def parsedate(value, dayfirst=False, yearfirst=False, errors=None):
|
||||
"""
|
||||
Parse a date and convert it to ISO date format: yyyy-mm-dd
|
||||
\b
|
||||
- dayfirst=True: treat xx as the day in xx/yy/zz
|
||||
- yearfirst=True: treat xx as the year in xx/yy/zz
|
||||
- errors=r.IGNORE to ignore values that cannot be parsed
|
||||
- errors=r.SET_NULL to set values that cannot be parsed to null
|
||||
"""
|
||||
try:
|
||||
return (
|
||||
parser.parse(value, dayfirst=dayfirst, yearfirst=yearfirst)
|
||||
.date()
|
||||
.isoformat()
|
||||
)
|
||||
except parser.ParserError:
|
||||
if errors is IGNORE:
|
||||
return value
|
||||
elif errors is SET_NULL:
|
||||
return None
|
||||
else:
|
||||
raise
|
||||
|
||||
|
||||
def parsedatetime(value, dayfirst=False, yearfirst=False, errors=None):
|
||||
"""
|
||||
Parse a datetime and convert it to ISO datetime format: yyyy-mm-ddTHH:MM:SS
|
||||
\b
|
||||
- dayfirst=True: treat xx as the day in xx/yy/zz
|
||||
- yearfirst=True: treat xx as the year in xx/yy/zz
|
||||
- errors=r.IGNORE to ignore values that cannot be parsed
|
||||
- errors=r.SET_NULL to set values that cannot be parsed to null
|
||||
"""
|
||||
try:
|
||||
return parser.parse(value, dayfirst=dayfirst, yearfirst=yearfirst).isoformat()
|
||||
except parser.ParserError:
|
||||
if errors is IGNORE:
|
||||
return value
|
||||
elif errors is SET_NULL:
|
||||
return None
|
||||
else:
|
||||
raise
|
||||
|
||||
|
||||
def jsonsplit(value, delimiter=",", type=str):
|
||||
'Convert a string like a,b,c into a JSON array ["a", "b", "c"]'
|
||||
"""
|
||||
Convert a string like a,b,c into a JSON array ["a", "b", "c"]
|
||||
"""
|
||||
return json.dumps([type(s.strip()) for s in value.split(delimiter)])
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue