使用mlcp,csv文件导入数据并转换解析日期

时间:2016-06-03 08:02:18

标签: xquery marklogic mlcp

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

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

感谢任何帮助...

我创建了transform.xqy并将其安装在MLogic的Modules上。我 考虑使用“xdmp:node-replace”将日期替换为expect 格式。或者我应该逐列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: ')
};

2 个答案:

答案 0 :(得分:2)

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

https://docs.marklogic.com/guide/mlcp/import#id_65640

它显示了这个示例,它为XML内容添加了一个属性:

return Datatables::of($meal)
        -> edit_column('type', '<a href="'. URL::to('admin/project' . $id ) .'" >'.trans('admin/meal.' . $type).'</a>');

请记住,您应该更新&#34;值&#34; $ content map的属性:map,并返回$ content以将转换结果添加到数据库中。我建议使用(可能是递归的)类型切换来识别元素节点,然后相应地调整它们的值。

HTH!

答案 1 :(得分:0)

终于做到了。

问题是我必须使用 mem:node-replace 因为它是在运行中,在内存上。虽然 xdmp:node-replace 是数据已经在MarkLogic上。

剩下的就是预期我必须使用 format-date 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  
};