XQueryで関数のようなことを行う方法はありtail()
ますか?
私が達成しようとしているのは、(「xdmp:filesystem-file($path)」を使用して) ファイルの内容を取得し、最後の 100 行のみを表示することです。これを行う良い方法が見つからないようです。何か案は?
ありがとうございました。
単純な 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)
};
純粋で短い 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)
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 に変更する以上のものが必要な場合