に変化の挙動を提出するために、私は(CNTKTextFormatリーダーが期待する)特定のTXTスキーマにCSVファイルを変換し、次の機能があります。F#ライティング戻り値の型
open System.IO
open FSharp.Data;
open Deedle;
let convert (inFileName : string) =
let data = Frame.ReadCsv(inFileName)
let outFileName = inFileName.Substring(0, (inFileName.Length - 4)) + ".txt"
use outFile = new StreamWriter(outFileName, false)
data.Rows.Observations
|> Seq.map(fun kvp ->
let row = kvp.Value |> Series.observations |> Seq.map(fun (k,v) -> v) |> Seq.toList
match row with
| label::data ->
let body = data |> List.map string |> String.concat " "
outFile.WriteLine(sprintf "|labels %A |features %s" label body)
printf "%A" label
| _ ->
failwith "Bad data."
)
|> ignore
不思議なことに、出力ファイルはで実行した後、空でありますF#インタラクティブパネルとそのprintf
は全く印刷を行いません。
私が代わりに私が手に空のファイルで、(ヌルの配列を返すことによって証明される)処理されている実際の行があることを確認するignore
を削除する場合:私はだった、前
val it : seq<unit> = Error: Cannot write to a closed TextWriter.
StreamWriter
をlet
とし、それを手動で破棄していると宣言していますが、空のファイルやほんの数行(数千から5個)も生成しました。
ここで何が起こっているかまた、どのようにファイルの書き込みを修正するには?
「Seq.map」はレイジーです。あなたが望むのは 'Seq.iter'です。これは副作用関数(' unit'を返す関数)を受け取り、非遅延的にseqの各項目にそれを適用します。 – rmunn