Как отформатировать результаты MarkLogic при экспорте в файл CSV - PullRequest
1 голос
/ 23 марта 2012

У меня есть XML, который структурирован аналогично примеру ниже, и я написал XQuery в MarkLogic, чтобы экспортировать его в CSV (см. Ниже XML).

Мне нужна помощь в форматировании вывода, чтобы при открытии файла CSV вместо того, чтобы выводить все выходные данные через 1, я бы хотел, чтобы он был сгруппирован, так сказать, «столбцами».

Допустим, для примера ниже я хотел бы вывести все значения элементов DataTime и Source и иметь значения в своих собственных столбцах, например:

2012-02-15T00:58:26 a
2012-02-15T00:58:26 b
2012-02-15T00:58:26 c

Как бы яидти об этом?

Приветствуются любые ориентиры или помощь.Заранее спасибо.

Вот пример XML:

<Document xmlns="http://fakeexample.org/schemas">
    <Information>
        <ItemId>1f28cb0c2c4f4eb7b13c4abf998e391e</ItemId>
        <MediaType>Text</MediaType>
        <DocDateTime>2012-02-15T00:58:26</DocDateTime>
    </Information>
    <FilingData>
        <DateTime>2012-02-15T00:58:26</DateTime>
        <Source>a</Source>
        </FilingData>
    <FilingData>
        <DateTime>2012-02-15T00:58:27</DateTime>
        <Source>b</Source>
    </FilingData>
    <FilingData>
        <DateTime>2012-02-15T00:58:28</DateTime>
        <Source>c</Source>
    </FilingData>
</Document>

Вот пример XQuery:

xquery version "1.0-ml";

declare default function namespace "http://www.w3.org/2005/xpath-functions";
declare namespace xdmp="http://marklogic.com/xdmp";
declare namespace exam="http://fakeexample.org/schemas";

declare function local:getDocument($url)
{

let $response := xdmp:document-get($url, 
       <options xmlns="xdmp:document-get">
           <repair>full</repair>
           <format>xml</format>
       </options>)

return $response
};

xdmp:set-response-content-type("text/csv"),
xdmp:add-response-header(
      "Content-disposition",
      fn:concat("attachment;filename=", "output", fn:current-time(), ".csv")
    ),
(
let $q := cts:element-value-query(xs:QName("exam:ItemId"), ("1f28cb0c2c4f4eb7b13c4abf998e391e"))

let $results := cts:search(fn:doc(), $q)

for $result in $results
return  fn:string-join((xs:string($result//exam:DateTime),
                        xs:string($result//exam:Source)                     
                        ), "," )
)

Ответы [ 2 ]

3 голосов
/ 23 марта 2012

Замените цикл for следующим:

return

string-join(
    for $result in $results//FilingData
    return  fn:string-join((xs:string($result//exam:DateTime),
                    xs:string($result//exam:Source)                     
                    ), "," )
, "&#10;")

Это должно сработать.

Редактировать: обратите внимание, что я добавил //FilingData позади $results. Это гарантирует, что DateTime и Source каждого FilingData объединяются отдельно и возвращаются как отдельные строки цикла for. Это позволяет внешнему соединению строки добавлять требуемые концы строк между ними.

Примечание: &#10; должен автоматически переводиться в определенные строки ОС.

0 голосов
/ 23 марта 2012

Опираясь на ответ @grtjn:

string-join(..., "&#10;")

Окончания строк могут обрабатываться по-разному в зависимости от ОС или приложения. Вы можете попробовать альтернативные символы (один или оба):

"&#x0A;" (LF) 
"&#x0D;" (CR)

Кроме того, это может быть предотвращено приложением, используемым для просмотра CSV. Например, большинство версий Microsoft Excel преобразуют все пробелы в ячейке, включая новые строки, в обычные пробелы.

...