2015-06-02 5 views
0

Я хочу использовать следующую консольную программу, чтобы получить информацию о типе (, а не данные) поставщика Csv. Имя файла будет передано как аргумент командной строки. Однако, кажется, CsvProvider<> принимает только постоянный литерал.Вывести информацию о типе для любых произвольных файлов CSV?

Есть ли способ обходного пути? Или это можно сделать с помощью скрипта F #? Или может помочь служба компилятора F #?

Или есть ли какой-либо другой проект?

open FSharp.Data 
open Microsoft.FSharp.Collections 
open System 

[<Literal>] 
let fn = """C:\...\myfile.csv""" // Want to dynamically set the fn from arguments 

[<EntryPoint>] 
let main argv = 
    let myFile = CsvProvider<fn>.GetSample() 
    // The following doesn't work 
    let fn = argv.[0] 
    let myFile = CsvProvider<fn>.GetSample() 

    // code to get type information of myFile 

ответ

1

Предлагается Tomas, для решения проблемы может использоваться следующая функция поставщика F # -Data CSV.

let data = CsvFile.Load(....) 
let inferredProperties = 
    // InferColumnTypes : inferRows:int 
    // * missingValues:string [] 
    // * cultureInfo:CultureInfo 
    // * schema:string 
    // * assumeMissingValues:bool 
    // * preferOptionals:bool 
    // * ?unitsOfMeasureProvider:IUnitsOfMeasureProvider 
    // -> PrimitiveInferedProperty list 
    data.InferColumnTypes(10000, [|""|], CultureInfo.InvariantCulture, "", false, true) 

Не знаете, какие параметры следует использовать. Но приведенные выше настройки выглядят нормально.

4

Я думаю, вы могли бы непонимание цели поставщика типа CSV - идея заключается в том, что у вас есть репрезентативная выборка ваших данных, доступной во время компиляции (и можете использовать его для руководства вывода типа). Во время выполнения вы просто передаете (возможно, другой) файл с тем же форматом. Это дает вам хороший способ обработки файлов с известным форматом.

Если вы хотите разобрать произвольные CSV-файлы (с разными заголовками и т. Д.), Поставщик CSV-типа не поможет. Тем не менее, вы все равно можете использовать тип CsvFile из F # Data, который предоставляет простой синтаксический анализатор CSV. Пример from the documentation:

// Download the stock prices 
let msft = CsvFile.Load("http://ichart.finance.yahoo.com/table.csv?s=MSFT") 

// Print the prices in the HLOC format 
for row in msft.Rows do 
    printfn "HLOC: (%s, %s, %s)" (row.GetColumn "High") 
    (row.GetColumn "Low") (row.GetColumn "Date") 

Здесь вы теряете хорошую статическую типизацию, но вы можете загрузить файл с любым форматом (а затем динамически посмотрите на столбцы, которые были доступны в файле).

+0

Спасибо. В одном из моих проектов я хочу использовать функции автоматического обнаружения/вывода данных типа CSV типа, чтобы получить типы столбцов любых произвольных файлов CSV. CsvFile не выводит/не выводит тип столбцов CSV, поэтому он не поможет. Вот почему я решил использовать динамический скрипт Create F # или службу компилятора F # с провайдером типа CSV для его достижения. – ca9163d9

+0

Или есть другие проекты F #, которые автоматически получают типы столбцов плоских файлов? На самом деле я думаю, что F # Data Type provider может экспортировать такую ​​очень полезную функцию, так как у нее уже есть что-то встроенное. – ca9163d9

+0

AFAIK, вывод типа в настоящее время не отображается в общедоступном API, но вы, безусловно, можете получить к нему доступ - хотя вам может понадобиться скопируйте соответствующие файлы из F # Data. Например, Deedle делает именно это: https://github.com/BlueMountainCapital/Deedle/blob/master/src/Deedle/FrameUtils.fs#L426 –

Смежные вопросы