我有一个标准的 gzip 文件,我想将其读入 F# 中的序列。我找到了一个示例,说明如何在 Expert F# 3.0 中读取常规文件,并参考MSDN 文档中的.NET GZipStream Class,但我是 F#/.NET 的新手,不知道如何将两者结合起来获得想要的结果。
具体来说,我如何修改下面的代码来读取一个 gzipped 文件,比如 test.txt.gz?
let linesOfFile =
seq {use reader = new StreamReader(File.OpenRead("test.txt"))
while not reader.EndOfStream do
yield reader.ReadLine()}
Run Code Online (Sandbox Code Playgroud) 是否groupBy保证在以下代码中保留排序顺序?
x
|> Seq.sortBy (fun (x, y) -> y)
|> Seq.groupBy (fun (x, y) -> x)
Run Code Online (Sandbox Code Playgroud)
通过保留排序顺序,我的意思是我们可以保证在每个分组中x,结果仍然按顺序排序y.
对于简单的例子,这是真的,
[(1, 3);(2, 1);(1, 1);(2, 3)]
|> Seq.sortBy (fun (x, y) -> y)
|> Seq.groupBy (fun (x, y) -> x)
// seq [(2, seq [(2, 1); (2, 3)]); (1, seq [(1, 1); (1, 3)])]
Run Code Online (Sandbox Code Playgroud)
我想确保没有奇怪的边缘情况.
我正在尝试使用 .Net CsvHelper 库将 F# 记录集合保存到 csv 文件。问题是选项类型未正确转换为字符串。
#r "nuget: CsvHelper"
open System.IO
open System.Globalization
open CsvHelper
type Record = { X : string; Y : float option }
let writeString x =
use writer = new StringWriter()
use csv = new CsvWriter(writer, CultureInfo.InvariantCulture)
csv.WriteRecords(x)
writer.ToString()
[{ X = "hi"; Y = Some 1.00}
{ X = "bye"; Y = None }]
|> writeString
Run Code Online (Sandbox Code Playgroud)
nan我期望此处第二个数据行中的第二个字段为空白值(或 CsvProvider 能够理解的任何其他值)。相反,CsvHelper 会将None值转换为0.
val it : string = "X,Value
hi,1 …Run Code Online (Sandbox Code Playgroud) 如何将变量路径传递给类型提供程序?
我有一个文件,我想使用位于不同PC上不同位置的SAS类型提供程序加载.
例如,我想做类似的事情:
[<Literal>]
let saspath =
match System.Environment.MachineName with
| "a" -> "c:/sas.sas7bdat"
| "b" -> "d:/sas.sas7bdat"
let sasfile = new SasFileTypeProvider<saspath>()
Run Code Online (Sandbox Code Playgroud)
但这不是有效的.它与F#中的Type提供者和静态参数有关,对于F#Type提供者,如何使相对路径作为静态参数工作?,但我没有使用相对路径的选项.
有没有一种快速的方法将歧视的联合转换为字符串?
我试图找出为什么花费数小时将大量记录集合使用各种方法保存到csv文件.我尝试过CsvProvider.Save,sprintf,string builder等等,所有这些都很慢.我想我已经将问题追溯到有区别的联合类型转换.
我的例子说明了这个问题.有没有更好的方法,或者我的"手动转换"是最好的选择.
#time
open System
type Field = | Ying | Yang
let manual = function | Ying -> "Ying" | Yang -> "Yang"
// Discriminated Union versions
[for i = 0 to 100000 do yield (Ying).ToString()] |> ignore
//Real: 00:00:12.963, CPU: 00:00:13.281, GC gen0: 10, gen1: 0, gen2: 0
[for i = 0 to 100000 do yield (Ying) |> manual] |> ignore
//Real: 00:00:00.004, CPU: 00:00:00.015, GC gen0: 0, gen1: 0, gen2: 0
// Others for comparison …Run Code Online (Sandbox Code Playgroud)