我有以下(工作)代码:
let a =
File.ReadAllLines("C:\ColorTable.dat")
|> Array.filter (fun i -> i.StartsWith(" "))
|> Array.iter (fun i ->
Console.WriteLine(@"ColorList.Add({0}, ""{1}"");", extract_num i, extract_col i)
f.WriteLine(@"ColorList.Add({0}, ""{1}"");", extract_num i, extract_col i)
)
函数 extract_num 和 extract_col 将正则表达式应用于文件行并提取其中的一部分。然后我将格式化字符串打印到控制台和到文件。
为此,我将格式化部分写入两次。什么是更干净的方法来做到这一点?当然,我可以定义一个函数来接受 extract_num 和 extract_col 返回格式化字符串并调用它两次,但是,为了学习,最实用的方法是什么? p>
我不知道,我可以将格式化的字符串输出到控制台并通过某种管道 fork 输出到文件吗?
谢谢
最佳答案
这是一些代码...
open System.IO
let ComposeTextWriters (tws:TextWriter[]) =
{ new TextWriter() with
override this.Encoding = System.Text.Encoding.Default
override this.Write(c:char) =
tws |> Array.iter (fun tw -> tw.Write(c)) }
let data = [(1,1); (2,2); (3,3)]
[<EntryPoint>]
let Main(_) =
use fileToWrite = new StreamWriter(File.OpenWrite("out.txt")) :> TextWriter
let stdout = System.Console.Out
let compositeOut = ComposeTextWriters [|fileToWrite;stdout|]
data |> List.iter (fun (x,y) ->
compositeOut.WriteLine("{0}: '{1}'", x, y))
0
我不知道这是否是一个很好的方法,但它似乎有效。 ComposeTextWriters 将 TextWriter 数组作为输入,并返回一个新的 TextWriter,将所有输出写入其中。这是您正在寻找的东西吗?
关于F# 叉管,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1147008/