2013-09-10 3 views
1

Я импортирую данные Excel в скрипт F #, который будет использоваться в регрессии R. Код:Преобразование типов в F #

let path = @"C:\Data\DataForRegression.csv" 
let fileStream = new FileStream(path,FileMode.Open,FileAccess.Read) 
let streamReader = new StreamReader(fileStream) 
let contents = streamReader.ReadToEnd() 

let cleanContents = 
    contents.Split([|'\n'|]) 
    |> Seq.map(fun line -> line.Split([|','|])) 
    |> Seq.skip(1) 
    |> Seq.map(fun values -> 
     Double.Parse(values.[0]), 
     Double.Parse(values.[1]), 
     DateTime.Parse(values.[2]).ToShortDateString(), 
     Int32.Parse(values.[3]), 
     Int32.Parse(values.[4]), 
     Int32.Parse(values.[5]), 
     Int32.Parse(values.[6])) 

//open R 
let environmentPath = System.Environment.GetEnvironmentVariable("PATH") 
let binaryPath = @"C:\Program Files\R\R-3.0.1\bin\x64" 
System.Environment.SetEnvironmentVariable("PATH",environmentPath+System.IO.Path.PathSeparator.ToString()+binaryPath) 

let engine = RDotNet.REngine.CreateInstance("RDotNet") 
engine.Initialize() 

let pmpm = engine.CreateNumericVector(cleanContents |> Seq.map (fun (a,b,c,d,e,f,g) -> a)) 
engine.SetSymbol("pmpm",pmpm) 

1-ые ряды данных выглядит следующим образом:

$ 66.92,0.9458, Ян-13,0,0,0,1

И когда Я запускаю его, я получаю это:

System.FormatException: строка ввода не была в правильном формате.
в System.Number.ParseDouble (значение String, параметры NumberStyles, NumberFormatInfo numfmt) в [email protected] (String [] значения) в C: \ ТФС \ Tff.RDotNetExample_Solution \ Tff.RDotNetExample \ RegressionUsingExcelImport .fsx: линия 19 в [email protected] (б &) при Microsoft.FSharp.Collections.IEnumerator.MapEnumerator 1.System-Collections-IEnumerator-MoveNext() at [email protected](b&)
at Microsoft.FSharp.Collections.IEnumerator.MapEnumerator
1.Система-Коллекции-IEnumerator-MoveNext() на System.Linq.Enumerable.Count [TSource] (IEnumerable 1 source) at RDotNet.Vector 1..ctor (двигатель REngine, SymbolicExpressionType type, IEnumerable 1 vector) at RDotNet.NumericVector..ctor(REngine engine, IEnumerable 1 вектор) на RDotNet.REngineExtension.CreateNumericVector (REngine двигатель, IEnumerable`1 вектор) в $ FSI_0002.main @() в C:. \ TFS \ Tff.RDotNetExample_Solution \ Tff.RDotNetExample \ RegressionUsingExcelImport.fsx: линия 35 Остановленный из-за к ошибке

У кого-нибудь есть представление о том, что мне нужно сделать для преобразования данных? Моя догадка в том, что ему не нравится «$», но он не вносит проблем в Double.Parse (если только он не оценивается?).

Заранее спасибо

+0

Эй, что это первая линия фактических данных (при условии, что вы не пытаетесь для синтаксического анализа текстового значения «PMPM» в double) ... – Snorex

ответ

5

Используйте следующее:

Double.Parse(values.[0], NumberStyles.AllowDecimalPoint ||| NumberStyles.AllowCurrencySymbol, CultureInfo("en-US")) 

См http://msdn.microsoft.com/en-us/library/fd84bdyt.aspx: Параметр

Индекс S интерпретируется с использованием комбинации флагов NumberStyles.Float и NumberStyles.AllowThousands. Это означает, что, например, допустимы пробелы и разделители тысяч, в то время как символы валют - нет. Для более тонкого контроля над тем, какие элементы стиля разрешены в s для успешной операции синтаксического анализа, вызовите метод Double.Parse (String, NumberStyles) или Double.Parse (String, NumberStyles, IFormatProvider).

Таким образом, даже если вы по умолчанию культуры уже один, который имеет $ как знак валюты, вы должны явно использовать NumberStyles.AllowCurrencySymbol

0

Попробуйте изменить Double.Parse(values.[0]) к Double.Parse(values.[0].Remove(0,1)), чтобы удалить знак доллара.

+0

Также об оценке ... после объявления 'cleanContents'' cleanContents' оценивается 'seq '.У меня создается впечатление, что, поскольку в нем есть лямбда, он не будет оценивать 'seq [(66.92, 0.9458,« 1/13/2013 », 0, 0, 0, 1)]', пока это не будет используется в 'engine.SetSymbol (« pmpm », pmpm)' – Snorex

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