Как читать в столбце, где дата представлена либо MM/DD/YYYY, либо просто YYYY в цифре для Neo4j
У меня есть CSV, где дата представлена двумя возможными способами в одном и том же столбце, как в:
- MM/DD / YYYY
или же
- YYYY
Вторая форма используется другими, которые делают ввод данных, когда MM/DD неизвестен.
Я хотел бы извлечь месяц, день и год как отдельные свойства на узле.
Я написал:
LOAD CSV WITH HEADERS FROM
'file:///...some_csv.csv' AS line
WITH
line
MERGE (p:Person {
subject_person_id: line.subject_person_id
})
ON CREATE SET p.month_of_birth = SPLIT(line.date_of_birth, '/')[0]
ON MATCH SET p.month_of_birth = SPLIT(line.date_of_birth, '/')[0]
который отлично работает для первого случая (ММ / ДД / ГГГГ), но не дотягивает только с ГГГГ. Во втором случае для месяца установлено значение ГГГГ, поскольку это 0-й элемент.
Я думаю, должно быть какое-то тестирование, для которого существует формат даты, затем условно делать SET в зависимости от результатов?
Я посмотрел на синтаксис для FOREACH
но попытался применить это, но это не казалось правильным подходом. У кого-нибудь есть совет? Спасибо!
2 ответа
Я думаю, что вам нужно заполнить массив пустых элементов. Например:
WITH SPLIT( 'MM/DD/YYYY', '/' ) as mdy1
SPLIT( 'YYYY', '/' ) as mdy2,
RETURN ( EXTRACT( x in RANGE( 0, 2 - size( mdy1 ) ) | "" ) + mdy1 ) [0] as m1,
( EXTRACT( x in RANGE( 0, 2 - size( mdy2 ) ) | "" ) + mdy2 ) [0] as m2
Хм... Неплохо. Но это не элегантно. Хорошо, давайте попробуем упростить:
WITH "MM/DD/YYYY" as mdy1,
"YYYY" as mdy2
RETURN ( ["", "", ""] + SPLIT( mdy1, "/" ) ) [ -3.. ][0] as m1,
( ["", "", ""] + SPLIT( mdy2, "/" ) ) [ -3.. ][0] as m2
Мы все еще можем улучшить? Вы никогда не знаете, что вы можете сделать, пока не попробуете:
WITH "MM/DD/YYYY" as mdy1,
"YYYY" as mdy2
RETURN ( SPLIT( "//" + mdy1, "/" ) ) [ -3.. ][0] as m1,
( SPLIT( "//" + mdy2, "/" ) ) [ -3.. ][0] as m2
Вы можете условно установить значение в регистре. Если вы получили плохое значение, то вы можете установить его на null
, Что-то вроде этого...
LOAD CSV WITH HEADERS FROM
'file:///...some_csv.csv' AS line
WITH line
, case
when size(line.date_of_birth) = 10 then
SPLIT(line.date_of_birth, '/')[0]
else
NULL
end as month
MERGE (p:Person { subject_person_id: line.subject_person_id})
ON CREATE SET p.month_of_birth = month
ON MATCH SET p.month_of_birth = month