小编nh2*_*nh2的帖子

如何在 f# 中读取 gzip 文件?

我有一个标准的 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)

f# gzip

4
推荐指数
1
解决办法
694
查看次数

(Array/List/Seq).groupBy是否维护组内的排序顺序?

是否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)

我想确保没有奇怪的边缘情况.

f#

3
推荐指数
1
解决办法
388
查看次数

如何将 CsvHelper.CsvWriter 与 F# 选项类型一起使用?

我正在尝试使用 .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)

f# csvhelper

3
推荐指数
1
解决办法
422
查看次数

使用变量作为F#类型提供程序引用的文件的路径

如何将变量路径传递给类型提供程序?

我有一个文件,我想使用位于不同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提供者,如何使相对路径作为静态参数工作?,但我没有使用相对路径的选项.

f# sas type-providers

2
推荐指数
1
解决办法
94
查看次数

为什么通过字符串或ToString()将F#区分联合转换为字符串这么慢?

有没有一种快速的方法将歧视的联合转换为字符串?

我试图找出为什么花费数小时将大量记录集合使用各种方法保存到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)

f# f#-data

2
推荐指数
1
解决办法
115
查看次数

标签 统计

f# ×5

csvhelper ×1

f#-data ×1

gzip ×1

sas ×1

type-providers ×1