3

XQueryで関数のようなことを行う方法はありtail()ますか?

私が達成しようとしているのは、(「xdmp:filesystem-file($path)」を使用して) ファイルの内容を取得し、最後の 100 行のみを表示することです。これを行う良い方法が見つからないようです。何か案は?

ありがとうございました。

4

3 に答える 3

4

単純な XQuery では、これは行に分割し、シーケンスの最後から目的の行数を取得してから、必要に応じてそれらを再結合することで実現できます。

declare function local:tail($content as xs:string, $number as xs:integer)
{
  let $linefeed := "
"
  let $lines := tokenize($content, $linefeed)
  let $tail := $lines[position() > last() - $number]
  return string-join($tail, $linefeed)
};
于 2011-05-07T07:56:52.307 に答える
1

純粋で短い XPath 2.0 ソリューション-- XQuery だけでなく、XSLT または XPath 2.0 をホストする他の PL でも使用できます。

for $numLines in count(tokenize(., '
'))
  return
    tokenize(., '
')[position() gt $numLines -100]

または:

for $numLines in count(tokenize(., '
'))
 return
    subsequence(tokenize(., '
'), $numLines -100 +1)
于 2011-05-07T16:40:42.293 に答える
0

xdmp:file-xx がテキストファイルの性質である場合、次のようなものを使用できます

let $f := 'any file system path'
return fn:tokenize(xdmp:filesystem-file($f), '[\n\r]+')[ fn:last() - 2 to fn:last()]

ここでは、改行とキャリッジ リターンをトークン スプリッターとして使用しています。トークン化するために何か他のものが必要な場合は、できます。単純なログ ファイルのテーリングの場合、このソリューションは正常に機能します。

与えられた例は、与えられたファイルの最後の 2 行を末尾にします。fn:last()-2 を fn:last() - x に変更する以上のものが必要な場合

于 2011-05-08T14:38:12.553 に答える