F# читать сжатый CSV-файл

Возможно ли использовать F# deedle для чтения сжатого csv прямо как read_csv функция в pandas? если это невозможно, возможно ли использовать провайдера csv-типа для этого?

2 ответа

Решение

Если вы используете пакет NuSe t ICSharpCode.SharpZipLib, вы можете прочитать CSV из архива с помощью Deedle следующим образом:

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)

Зачем вам нужно читать 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()

Если ваш ввод может принимать поток (как в приведенных выше библиотеках), тогда эта служебная функция сделает это (используя OpenRead непосредственно в zipfile):

//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, но не надо его открывать.

Другие вопросы по тегам