2014-01-23 13 views
2

我正在爲使用ExcelDNA的Excel編寫一個F#加載項UDF,理想情況下我想根據另一個CSV的內容動態加載CSV。使用F#數據CSV類型提供者與CSV解析器和閱讀器之間的性能差異

我一直使用在下面的F#數據庫類型提供商和CSV解析器: http://fsharp.github.io/FSharp.Data/library/CsvProvider.html

類型供應商不會讓我傳遞一個變量來編譯時間之前一個字符串,因爲它不是靜態的(也許我做錯了什麼 - 請看下面的代碼不起作用)。

let getcontractperiod = new CsvProvider<"P:/Datastructures/contract_variables.csv", ",">() 
let contractperiodfilelocation = getcontractperiod.Filter(fun row -> row.ContractModelID="MyContractTest").Data 
let closescc = [| yield! contractperiodfilelocation |> Seq.map (fun x -> x.FileLocation) |] 


let onstructure = new CsvProvider<closescc.[0], ",">() 

無效的靜態參數來提供的類型。期望有一種「串」的論點。

但是,如果我使用CSV解析器從相同的庫它的作品(但我失去了強類型的提供方面)。

let getcontractperiod = new CsvProvider<"P:/Datastructures/contract_variables.csv", ",">() 
let contractperiodfilelocation = getcontractperiod.Filter(fun row -> row.ContractModelID="MyContractTest").Data 
let closescc = [| yield! contractperiodfilelocation |> Seq.map (fun x -> x.FileLocation) |] 

let onstructure = CsvFile.Load(closescc.[0]).Cache() 

我想知道的是:
由於這將在Excel中多次調用,是否會有一個顯著的性能損失使用CsvParse方法相對於CSV類型供應商,特別是當我需要在csvparse方法中轉換/轉換任何東西。

注意我需要爲每次計算加載大約4個csvs,csvs大約需要600-2000行。在這個階段,我沒有選擇去數據庫的選擇。

謝謝。

+0

爲什麼不試試看看。另外,我認爲你的意思是其中一個代碼塊是不同的。 –

+0

我不確定CSV類型提供程序是如何工作的,但是對於'SqlEntityConnection'(數據庫提供程序),它確實需要一個連接字符串來創建類型,但是您可以提供* different *連接字符串作爲參數創建上下文時。它效果很好,只要兩個數據庫是相同的。 CSV提供者沒有這種選擇嗎? –

回答

3

您傳遞給CsvProvider的靜態字符串參數是它用於推斷模式的模板,但您可以在運行時使用不同的值。因此,而不是這樣的:

let sample = new CsvProvider<"Sample.csv">() 

這樣做:

let csv = CsvProvider<"Sample.csv">.Load("runtimeLocation.csv") 

或本:

type CsvType = CsvProvider<"Sample.csv"> 
let csv = CsvType.Load("runtimeLocation.csv") 

至於表現,CsvProvider使用相同的CSV解析器內部,所以CsvFile應該有類似性能特點,差別只是強打字

+0

謝謝,這正是我之後的! – ct1