F# 读取压缩的 csv 文件
F# read zipped csv file
是否可以像pandas
中的read_csv
函数那样使用F#deedle直接读取压缩的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)
为什么需要直接读取压缩文件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
,但不需要打开它。
是否可以像pandas
中的read_csv
函数那样使用F#deedle直接读取压缩的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)
为什么需要直接读取压缩文件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
,但不需要打开它。