F# 读取压缩的 CSV 文件

3

是否可以使用F# Deedle直接读取压缩的CSV文件,就像Pandas中的read_csv函数一样?如果不可能,那么是否可以使用CSV类型提供程序来实现?

2个回答

3
如果使用ICSharpCode.SharpZipLib NuGet包,您可以像这样使用Deedle从zip文件中读取CSV:
open ICSharpCode.SharpZipLib.Zip
open System.IO
open Deedle

[<EntryPoint>]
let main argv = 
    use fs = new FileStream(@"mycsv.zip", FileMode.Open, FileAccess.Read)
    use zip = new ZipFile(fs)
    use csv = zip.GetInputStream(0L)
    let frame = Frame.ReadCsv(csv)

1
为什么需要直接读取zipfile csv?您可以通过System.IO.Compression访问文件,然后将其提供给Deedle或CSVProvider甚至FileHelper。
open System.IO.Compression  
open System.IO

let zipfile =  @"C:\tmp\zipFile1.zip"

let unzip (zipfile:string) =
    let zipf = new FileStream(zipfile,FileMode.Open,FileAccess.Read)
    let zip  = new ZipArchive(zipf)
    zip

let unzipFile = unzip zipfile
let stream = new StreamReader(unzipFile.GetEntry("zipFile1.csv").Open())  
let txt = stream.ReadToEnd()

如果您的输入可以接受流(例如上述库),那么此实用程序函数将执行它(直接在zipfile上使用OpenRead)。
//string * string -> StreamReader
let getFromZip(entry,zip) =
    ZipFile.OpenRead(zip)
        |> (fun x -> x.GetEntry(entry))
        |> (fun x -> new StreamReader(x.Open()))

您可能还需要引用System.IO.Compression.FileSystem,但不需要打开它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接