У меня есть следующие функции, которые преобразуют CSV файлы в конкретные текстовых схемы (ожидаемых 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
и удалив его вручную, но я также создал пустые файлы или несколько строк (скажем, 5 из тысяч).
Что здесь происходит? Также, как исправить запись файла?
'Seq.map' ленив. То, что вы хотите, это 'Seq.iter', который принимает функцию побочного эффекта (тот, который возвращает' unit'), и, НЕ ЛЕЖНО, применяет его к каждому элементу в seq. – rmunn