Как читать в столбце, где дата представлена ​​либо 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
Другие вопросы по тегам