我有以下功能CSV文件轉換到一個特定的TXT模式(由CNTKTextFormat閱讀器預計):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
並手動處理它,但我也生成空文件或只是幾行(比如說成千上萬)。
這裏發生了什麼?另外,如何解決文件寫入?
'Seq.map'是懶惰的。你想要的是'Seq.iter',它需要一個副作用函數(返回'unit'),並且不會延遲地將它應用到seq中的每個項目。 – rmunn