繁体   English   中英

F#读取压缩的CSV文件

[英]F# read zipped csv file

是否可以像pandasread_csv函数那样使用F#控件直接读取压缩的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)

为什么需要直接读取zip文件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()

如果您的输入可以接受流(如上述库),则此实用程序功能可以做到这一点(直接在zip文件上使用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 ,但无需打开它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM