1

私はF#を学ぼうとしています

私がやりたいのは、Webページをダウンロードし、それをシーケンスに分割してから、アイテムのインデックスを見つけて、その次の3つのアイテムを取得することです。

ここにコードがあります-誰かが私が間違っていることを教えてもらえますか?

let find = "<head>"
let page = downloadUrl("http://www.stackoverflow.com")
let lines = seq (  page.Replace("\r", System.String.Empty).Split([|"\n"|],   StringSplitOptions.RemoveEmptyEntries)  )
let pos = lines |> Seq.findIndex(fun a -> a == find) // getting a Exception of type 'System.Collections.Generic.KeyNotFoundException' was thrown.
let result = // now to get the next 3 items
printfn "%A" (Seq.toList result);;
4

2 に答える 2

3

つまり、F#テキスト処理を行っているということです。考えられる問題は次のとおりです。

  1. HTMLページをダウンロードした後は、前処理を行わず、たとえばすべてのHTMLタグを削除しました。

  2. page.Replace("\r", System.String.Empty).Split([|"\n"|]アイテム/単語を分割したいと思うので問題があります。この行は、行を分割するだけです。

  3. let pos = lines |> Seq.findIndex(fun a -> a == find)に変更===ます。F#では、=は比較用のブール演算子です。

  4. let result = lines |> Seq.take pospos最初のアイテムのみを取ります。これらのアイテムをスキップしてから、次のようにposアイテムを取得する必要があります。

lines
|> Seq.skip (pos+1)
|> Seq.take 3
于 2011-04-26T06:16:56.317 に答える
2
let result = lines |> Seq.take pos

この行は、見つかったアイテムの前のすべてをスキップし、その後の3つのアイテムはスキップしません。

編集: Seq.findIndex検索されたアイテムが存在しない場合は失敗します。あなたが欲しいSeq.tryFindIndex

match lines |> Seq.tryFindIndex(fun a -> a == find) with
| Some pos -> let result = // now to get the next 3 items
              printfn "%A" (Seq.toList result)
| None     -> ()
于 2011-04-26T06:12:08.010 に答える