繁体   English   中英

以 CSV 格式返回 xdmp:sql() 值 XQuery

[英]Return xdmp:sql() values in CSV format XQuery

我们如何将 xdmp:sql() 值作为 csv(逗号分隔)结果返回? 到目前为止,这是我尝试做的:

(: The "format" option returns queries delimited with | :)

(: In other words this would return something like this:
    | foo| boo|
    | 1| 2|
:)
(: We want this:
    foo,boo
    1,2
:)
let $x := xdmp:sql("SELECT foo, boo FROM TableName", "format")
let $res :=
 for $item in $res
 let $newItem := fn:replace(xs:string($item), "\|", ",")
 return $newItem
return $res

(:returns:
  , foo, boo,
  , 1, 2,
:)
(: too many commas and whitespaces :)

我的问题是,除了手动将其更改为 csv 格式之外,是否还有更简单的方法来执行此操作(就像 XQuery 或 MarkLogic 提供 SQL 到 CSV 函数一样),如果没有,最好的方法是什么?

一种适用于 SQL、SPARQL 或 Optic 的替代方法是引用“sparql-results-csv”输出方法,如下所示:

xdmp:quote(
    xdmp:sql("SELECT foo, boo FROM TableName"),
    map:entry("method", "sparql-results-csv")
    )

此外,REST API 的/v1/rows端点可以为 Optic 查询返回 CSV 响应。 Optic 查询可以通过 op:from-sql() 访问器执行 SQL 或通过 op:from-sparql() 访问器执行 SPARQL。

有关更多信息,请参阅

最直接和天真的方法是使用这个:

let $res := xdmp:sql("SELECT foo, boo FROM TableName", "array")
for $row in $res
let $values := json:array-values($row) ! xs:string(.)
return string-join($values, ',')

不要捕获变量中的所有行以进行换行的字符串连接,只要尽可能直接返回即可。 MarkLogic 将使用换行符自动分隔行。 这将确保流式传输,因此您可以轻松达到几百万行。

但是它不能很好地扩展,并且要生成完全正确的 CSV,您可能必须对单元格值进行转义。

哼!

经过反复试验,我发现此解决方案最适合生成 CSV 输出:

let $res := xdmp:sql("SELECT foo, boo FROM TableName", "map")
for $key in map:keys($res)
let $val := map:get($res, $key)
return fn:string-join(($key, $val), ",")

通过迭代映射中的键,只需获取键和值,然后用逗号分隔每个键和值对就很简单了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM