F#读取压缩的csv文件

F#读取压缩的csv文件,csv,f#,deedle,Csv,F#,Deedle,是否可以使用F#deedle直接读取压缩的csv,就像pandas中的read#u csv功能一样?如果不可能,是否可以使用csv类型提供程序执行此操作?如果使用ICSharpCode.SharpZipLib NuGet软件包,您可以使用Deedle从zip读取csv,如下所示: open ICSharpCode.SharpZipLib.Zip open System.IO open Deedle [<EntryPoint>] let main argv = use fs

是否可以使用F#deedle直接读取压缩的csv,就像
pandas
中的
read#u csv
功能一样?如果不可能,是否可以使用csv类型提供程序执行此操作?

如果使用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)
打开ICSharpCode.SharpZipLib.Zip
开放系统
开放式Deedle
[]
让主argv=
使用fs=newfilestream(@“mycsv.zip”、FileMode.Open、FileAccess.Read)
使用zip=新ZipFile(fs)
使用csv=zip.GetInputStream(0L)
设frame=frame.ReadCsv(csv)

为什么需要直接读取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):

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

//string * string -> StreamReader
let getFromZip(entry,zip) =
    ZipFile.OpenRead(zip)
        |> (fun x -> x.GetEntry(entry))
        |> (fun x -> new StreamReader(x.Open()))