Xquery 使用mlcp、csv文件和转换解析日期导入数据

Xquery 使用mlcp、csv文件和转换解析日期导入数据,xquery,marklogic,mlcp,Xquery,Marklogic,Mlcp,我有一个csv文件。我已经使用mlcp将这些数据导入到MarkLogic中,mlcp随后在MarkLogic中创建了一个xml文件 现在在csv中,我在其中一列中随机设置了“6/29/2013 5:00:00 PM”格式。如何使用xquery和node replace作为转换函数,将此日期转换为不同的格式,例如“2013-06-29”作为MarkLogic默认日期格式 感谢您的帮助 我已经创建了transform.xqy,并将其安装在MLogic中的模块上。我是 考虑使用“xdmp:node

我有一个csv文件。我已经使用mlcp将这些数据导入到MarkLogic中,mlcp随后在MarkLogic中创建了一个xml文件

现在在csv中,我在其中一列中随机设置了“6/29/2013 5:00:00 PM”格式。如何使用xquery和node replace作为转换函数,将此日期转换为不同的格式,例如“2013-06-29”作为MarkLogic默认日期格式

感谢您的帮助


我已经创建了transform.xqy,并将其安装在MLogic中的模块上。我是 考虑使用“xdmp:node replace”将日期替换为预期日期 格式。或者我应该一列一列地浏览csv(怎么做?)并且 使用“castable as xs:dateTime”来确定日期值。然而,即使 只是打印出内容值/uri,总是给我错误

xquery version "1.0-ml";
module namespace example = "http://test.com/example";

(: If the input document is XML, insert @NEWATTR, with the value
 : specified in the input parameter. If the input document is not
 : XML, leave it as-is.
 :)
declare function example:transform(
  $content as map:map,
  $context as map:map
) as map:map*
{
  let $the-doc-uri := map:get($content, "uri")
  let $the-doc := map:get($content, "value")
  return
    trace($the-doc, 'The value of doc is: ')
};

MarkLogic文档包含MLCP转换的完整示例:

它显示了以下示例,该示例向XML内容添加了一个属性:

declare function example:transform(
  $content as map:map,
  $context as map:map
) as map:map*
{
  let $attr-value := 
   (map:get($context, "transform_param"), "UNDEFINED")[1]
  let $the-doc := map:get($content, "value")
  return
    if (fn:empty($the-doc/element()))
    then $content
    else
      let $root := $the-doc/*
      return (
        map:put($content, "value",
          document {
            $root/preceding-sibling::node(),
            element {fn:name($root)} {
              attribute { fn:QName("", "NEWATTR") } {$attr-value},
              $root/@*,
              $root/node()
            },
            $root/following-sibling::node()
          }
        ), $content
      )
};
请记住,您应该更新$content map:map的“value”属性,并返回$content以将转换结果添加到数据库中。我建议使用(可能是递归的)类型开关来标识元素节点,然后相应地调整它们的值

终于做到了

问题是我必须使用mem:node replace,因为它是动态的,在内存中。而xdmp:node replace是当数据已经在MarkLogic上时

其余部分如预期一样,我必须使用格式化日期xdmp:parse dateTime来获取所需的日期格式

下面是一些片段

xquery version "1.0-ml";
module namespace ns_transform = "this_is_my_namespace";
import module namespace mem = "http://xqdev.com/in-mem-update" at "/MarkLogic/appservices/utils/in-mem-update.xqy";

declare variable $ns := "this_is_my_namespace";

declare function ns_transform:transform(
  $content as map:map,
  $context as map:map
) as map:map*
{  

    let $doc := map:get($content, "value")

    let $format_in := "[M]/[D]/[Y0001] [h01]:[m01]:[s01] [P]"
    let $format_out := "[Y0001]-[M01]-[D01]"

    let $old_date := $doc/*:root_doc/*:date/text()
    let $new_date :=  format-date(xs:date(xdmp:parse-dateTime($format_in, $old_date)), $format_out)

    let $new_doc := mem:node-replace($doc/*:root_doc/*:date,element {fn:QName($ns, "date")}{$new_date})
    let $_ := map:put($content, "value", $new_doc)

    return $content  
};

到目前为止你做了什么?您可以使用
datetime.ParseExact(“dd/MM/yyyy hh:MM:ss”)
读取日期时间,然后将其转换为您首选格式的字符串……实际上,这与日期解析的语法无关。但是,我们如何使用mlcp上的transform函数动态转换此日期格式以获得预期的结果。如果需要进行大量替换,则mem update库中的上述操作有点慢。使用此选项可以获得更好的性能:我还在这个库中捆绑了一些日期解析功能: