public static List <evenement> calculTauxExchange(Data.DataExchangeRate exchange, DateTime debut, DateTime fin) { List <evenement> retour = new List <evenement>(); List <DateTime> listedate = listeDate(debut, fin); int nb_date = listedate.Count; int cpt = 0; double val1; double val2; double val; String nomCol1 = exchange.Columns[0]; String nomCol2 = exchange.Columns[1]; while (cpt < nb_date) { val1 = (double)exchange.Ds.Tables[0].Rows[cpt][nomCol1]; val2 = (double)exchange.Ds.Tables[0].Rows[cpt][nomCol2]; if (val1 != 0) { val = val2 / val1; } else { val = val2; } evenement event1 = new evenement(val, listedate[cpt]); retour.Add(event1); cpt++; } return(retour); }
/// <summary> /// Télécharge le fichier désiré /// et la parse, en remplissant les données /// </summary> /// <param name="d">Base de donnée, doit être de type ExchangeRate</param> public override void ImportAndParse(Data.Data d, Data.DataRetour Erreur = null) { // On vérifie que les données soient de type ExchangeRate switch (d.Type) { case Data.Data.TypeData.ExchangeRate: //On teste le bon ordre des dates if (d.End < d.Start) { throw new WrongDates(@"La date de fin ne peut être antérieure au début de l'acquisition"); } // Cast, pour obtenir la fréquence Data.DataExchangeRate der = (Data.DataExchangeRate)d; CultureInfo culture = CultureInfo.GetCultureInfo("EN"); List <string> list; if (der.Freq == Data.Data.Frequency.Daily) { list = der.Columns; } else { list = der.Symbol; } // pour contenir la liste des entrées incorecte List <string> listeErreur = new List <string>(); // Pour chaque symbol, on récupère le fichier et on le parse foreach (var symb in list) { string[] monnaie = symb.Split('/'); //Récupération de l'url //http://fxtop.com/en/historical-exchange-rates.php?A=1&C1=EUR&C2=USD&DD1=1&MM1=1&YYYY1=2012&B=1&P=&I=1&DD2=1&MM21&YYYY2=2013&btnOK=Go%21 //http://fxtop.com/en/historical-exchange-rates.php?A=1&C1=EUR&C2=USD&MA=1&DD1=01&MM1=05&YYYY1=2014&B=1&P=&I=1&DD2=01&MM2=06&YYYY2=2014&btnOK=Go%21 //http://fxtop.com/en/historical-exchange-rates.php?A=1&C1=ADF&C2=ALL&MA=1&DD1=1&MM1=4&YYYY1=2014&B=1&P=&I=1&DD2=1&MM2=5&YYYY2=2014&btnOK=Go%21 string url; if (der.Freq == Data.Data.Frequency.Daily) { url = "http://fxtop.com/en/historical-exchange-rates.php?A=1&C1=" + monnaie[0] + "&C2=" + monnaie[1] + "&DD1=" + der.Start.ToString("dd") + "&MM1=" + der.Start.ToString("MM") + "&YYYY1=" + der.Start.ToString("yyyy") + "&B=1&P=&I=1&DD2=" + der.End.ToString("dd") + "&MM2=" + der.End.ToString("MM") + "&YYYY2=" + der.End.ToString("yyyy") + "&btnOK=Go%21"; } else { string choixFreq; if (der.Freq == Data.Data.Frequency.Monthly) { choixFreq = "&MA=1"; } else { choixFreq = "&YA=1"; } url = "http://fxtop.com/en/historical-exchange-rates.php?A=1&C1=" + monnaie[0] + "&C2=" + monnaie[1] + choixFreq + "&DD1=" + der.Start.ToString("dd") + "&MM1=" + der.Start.ToString("MM") + "&YYYY1=" + der.Start.ToString("yyyy") + "&B=1&P=&I=1&DD2=" + der.End.ToString("dd") + "&MM2=" + der.End.ToString("MM") + "&YYYY2=" + der.End.ToString("yyyy") + "&btnOK=Go%21"; } _Filepath = "FxTop_" + monnaie[0] + "_" + monnaie[1] + "_" + der.Freq.ToString() + "_" + der.Start.ToString("dd-MM-yy") + "_" + der.End.ToString("dd-MM-yy") + ".html"; Uri siteUri = new Uri(url); try { // Télécharge le fichier ImportFile(siteUri); // On indique au parser le symbol courant et le nom du fichier, puis on parse le fichier obtenu _Parser.set(_Filepath, symb); _Parser.ParseFile(d); } catch { listeErreur.Add(symb); } // On insère les données dans d Parser.ParserGenerique p = (Parser.ParserGenerique)_Parser; DataSet ds = p.getDataSet(); insertData(d, ds, symb); // On supprime le fichier System.IO.File.Delete(@_Filepath); } // on renvoie la liste d'erreur if (listeErreur.Count != 0) { Erreur.SetListeErreur(listeErreur); } break; default: throw new Mauvaistype(@"Mauvais Type utilisé"); } }
/// <summary> /// Insère le contenu du DataSet dans le Data /// </summary> /// <param name="d">Base de donnée</param> /// <param name="ds">Données</param> /// <param name="symb">Symbol courant</param> private void insertData(Data.Data d, DataSet ds, string symb) { int nTable = ds.Tables.Count; int nRow = ds.Tables[nTable - 1].Rows.Count; if (nRow == 0) { return; } // Détermine le nombre de colonne du DataSet int nbColDS = 1; int n = (int)ds.Tables[nTable - 1].Rows[0][1]; while (nRow > nbColDS && n == (int)ds.Tables[nTable - 1].Rows[nbColDS][1]) { nbColDS++; } Data.DataExchangeRate der = (Data.DataExchangeRate)d; if (der.Freq == Data.Data.Frequency.Daily) { // Si aucune ligne, Alors on les crée if (d.Ds.Tables[0].Rows.Count == 0) { for (int i = 0; i < nRow / nbColDS; i++) { DataRow dr = d.Ds.Tables[0].NewRow(); dr["Symbol"] = symb.Substring(0, symb.IndexOf("/")); dr["Date"] = DateTime.Parse(ds.Tables[nTable - 1].Rows[i * nbColDS][0].ToString(), _Culture); d.Ds.Tables[0].Rows.Add(dr); } } for (int i = 0; i < nRow / nbColDS; i++) { d.Ds.Tables[0].Rows[i][symb] = Double.Parse(ds.Tables[nTable - 1].Rows[i * nbColDS + 1][0].ToString(), _Culture); } } else { for (int i = 0; i < nRow / nbColDS; i++) { // On crée une nouvelle ligne DataRow dr = d.Ds.Tables[0].NewRow(); dr["Symbol"] = symb; // Récupération de la date string date; if (der.Freq == Data.Data.Frequency.Monthly) { date = ds.Tables[nTable - 1].Rows[i * nbColDS][0].ToString() + "-01"; } else { date = ds.Tables[nTable - 1].Rows[i * nbColDS][0].ToString() + "-01-01"; } dr["Date"] = DateTime.Parse(date, _Culture); int k = 1; foreach (string s in d.Columns) { dr[s] = Double.Parse(ds.Tables[nTable - 1].Rows[i * nbColDS + k][0].ToString(), _Culture); k++; } d.Ds.Tables[0].Rows.Add(dr); } } }
/// <summary> /// Parse le fichier désiré /// Insère les données dans d /// </summary> /// <param name="d">base de donnée</param> public override void ParseFile(Data.Data d) { WebAPI_final.Models.Constantes.displayDEBUG("start parseXML", 2); DataSet ds = new DataSet(); try { ds.ReadXmlSchema(_FilepathSchema); WebAPI_final.Models.Constantes.displayDEBUG("ReadXmlSchema Done", 3); ds.ReadXml(_Filepath, XmlReadMode.ReadSchema); WebAPI_final.Models.Constantes.displayDEBUG("ReadXml Done", 3); } catch (Exception e) { throw new XMLException("Problème lecture fichier XML : " + e.Message); } WebAPI_final.Models.Constantes.displayDEBUG("end parseXML", 2); string nameFunction = ds.Tables[0].Rows[0][0].ToString(); if (nameFunction.Equals("historical")) { // Dates DateTime debut = DateTime.Parse(ds.Tables[2].Rows[0][0].ToString()); DateTime fin = DateTime.Parse(ds.Tables[2].Rows[0][1].ToString()); // Liste Symbol List <string> symbol = new List <string>(); for (int i = 0; i < ds.Tables[3].Rows.Count; i++) { symbol.Add(ds.Tables[3].Rows[i][0].ToString()); } // Liste Colonnes List <Data.Data.HistoricalColumn> columns = new List <Data.Data.HistoricalColumn>(); for (int i = 0; i < ds.Tables[4].Rows.Count; i++) { columns.Add((Data.Data.HistoricalColumn) Enum.Parse(typeof(Data.Data.HistoricalColumn), ds.Tables[4].Rows[i][0].ToString())); } // Création du Data Data.DataActif data = new Data.DataActif(symbol, columns, debut, fin); // Import des données désirées ImportParse.Yahoo import = new ImportParse.Yahoo(); import.ImportAndParse(data); // Transfert des données d.set(data.Ds, data.Symbol, data.Columns, debut, fin); } else if (nameFunction.Equals("exchange")) { // Dates DateTime debut = DateTime.Parse(ds.Tables[5].Rows[0][0].ToString()); DateTime fin = DateTime.Parse(ds.Tables[5].Rows[0][1].ToString()); // Liste Symbol Data.Data.Currency symbol = (Data.Data.Currency)Enum.Parse(typeof(Data.Data.Currency), ds.Tables[5].Rows[0][2].ToString()); // Fréquence Data.Data.Frequency freq = (Data.Data.Frequency)Enum.Parse(typeof(Data.Data.Frequency), ds.Tables[5].Rows[0][3].ToString()); // Liste Colonnes List <Data.Data.Currency> columns = new List <Data.Data.Currency>(); for (int i = 0; i < ds.Tables[6].Rows.Count; i++) { columns.Add((Data.Data.Currency) Enum.Parse(typeof(Data.Data.Currency), ds.Tables[6].Rows[i][0].ToString())); } // Création du Data Data.DataExchangeRate data = new Data.DataExchangeRate(symbol, columns, debut, fin, freq); // Import des données désirées ImportParse.FXTop import = new ImportParse.FXTop(); import.ImportAndParse(data); // Transfert des données d.set(data.Ds, data.Symbol, data.Columns, debut, fin); } else if (nameFunction.Equals("interest")) { // Dates DateTime debut = DateTime.Parse(ds.Tables[7].Rows[0][0].ToString()); DateTime fin = DateTime.Parse(ds.Tables[7].Rows[0][1].ToString()); // Symbol Data.Data.InterestRate symbol = (Data.Data.InterestRate) Enum.Parse(typeof(Data.Data.InterestRate), ds.Tables[7].Rows[0][2].ToString()); // Création du Data Data.DataInterestRate data = new Data.DataInterestRate(symbol, debut, fin); // Import des données désirées ImportParse.EBF import = new ImportParse.EBF(); import.ImportAndParse(data); // Transfert des données d.set(data.Ds, data.Symbol, data.Columns, debut, fin); } else { throw new XMLException("Nom de fonction inconnu : " + nameFunction); } }