2016-07-28 4 views
0

Ich schreibe ein Skript, um eine Reihe von Daten zu durchlaufen, überprüfe, ob jedes Datum ein gültiger Handelstag ist und überprüfe, dass für jedes Datum ein entsprechender Ordner- und Dateiname existiert.C# Zeichen geändert beim Zurückgeben von Zip-Ordner- und Dateinamen

Quantconnect/Lean Githib repo for classes

Das Problem, das ich habe, ist, dass meine File.Exists(dataFile) Methode ist falsch jedes Mal kommen. Grund ist, dass die Namen der Ordner, die in formattedFolderName gespeichert werden, ihre Zeichen geändert haben.

Die Zielordner selbst sind gezippt, also frage ich mich, ob das vielleicht das Problem ist?

Intended Dateipfad: C:\Users\richa_000\Desktop\exporter\forex\fxcm\minute\audjpy\20070401_quote\20070401_audjpy_minute_quote

tatsächlicher Dateipfad: C:\Users\richa_000\Desktop\exporter\forex\fxcm\minute\audjpy\20070401_quoAe\20070401_au1jp7_0inuAe_quoAe

Ich denke, es Zip-Ordner sein könnte, 20070401_quote mit dieser Unordnung, aber ich bin mir nicht sicher.

Program.cs

using System; 
using System.IO; 
using QuantConnect; 
using QuantConnect.Securities; 
using QuantConnect.Securities.Forex; 

namespace TradingDaysFileChecker 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var startDate = new DateTime(2007, 04, 01); 
      var endDate = new DateTime(2016, 07, 25); 
      var dataFilePath = @"C:\Users\richa_000\Desktop\exporter\forex\fxcm\minute\"; 

      var securityType = SecurityType.Forex; 
      var ticker = TickType.Trade; 
      var marketHoursDatabase = MarketHoursDatabase.FromDataFolder(); 
      var market = Market.FXCM; 
      var symbol = Symbol.Create(ticker.ToString(), securityType, market); 
      var marketHoursDbEntry = marketHoursDatabase.GetEntry(symbol.ID.Market, symbol.Value, symbol.ID.SecurityType); 

      var exchange = new ForexExchange(marketHoursDbEntry.ExchangeHours); 
      var validTradingDays = new DateHandler(startDate, endDate, dataFilePath).IterateOverDateRange(exchange); 

      var forexSecuritiesFolders = Directory.GetDirectories(dataFilePath); 

       foreach (var validDay in validTradingDays) 
       { 
        foreach (var forexSecurity in forexSecuritiesFolders) 
        { 
         var securityName = new DirectoryInfo(forexSecurity).Name.ToString(); 
         var formattedFolderName = validDay.ToString("yyyyMMdd_quote"); 
         var formattedFileName = validDay.ToString($"yyyyMMdd_{securityName}_minute_quote"); 

         var dataFile = dataFilePath + securityName + @"\" + formattedFolderName + @"\" + formattedFileName; 

         if (!File.Exists(dataFile)) 
         { 
          Console.WriteLine(dataFile); 
          Console.ReadLine(); // Stopping after the first run while troubleshooting 
         } 
        } 
       } 
       Console.ReadLine(); 
     } 
    } 
} 

DateHandler.cs

using System; 
using System.Collections.Generic; 
using QuantConnect.Securities.Forex; 

namespace TradingDaysFileChecker 
{ 
    public class DateHandler 
    { 
     private DateTime _startDate; 
     private DateTime _endDate; 

     public DateHandler(DateTime startDate, DateTime endDate, string filePath) 
     { 
      _startDate = startDate; 
      _endDate = endDate; 
     } 

     public IEnumerable<DateTime> IterateOverDateRange(ForexExchange exchange) 
     { 
      for (var day = _startDate.Date; day.Date <= _endDate.Date; day = day.AddDays(1)) 
       if (exchange.IsOpenDuringBar(day.Date, day.Date.AddDays(1), false)) 
       { 
        yield return day; 
       } 
     } 
    } 
} 
+0

Haben Sie versucht, Ihre \ Flucht anstatt wörtlich Strings zu verwenden? Also "\\" statt @ "\"? –

+0

@EricWalker Ja ich habe, es wird das gleiche Ergebnis –

Antwort

1

Ok, dann ist es, wie Sie Ihre formatierten Namen aus den Datetime-Objekte zu bauen. Wenn Sie .ToString() aufrufen, sucht es nach speziellen Formatierungszeichen, sodass Sie in keinem literalen Text beliebige enthalten können. Ihr 't' wird in A umgewandelt, weil 't' das Formatierungszeichen für den Meridian ist (AM/PM, aber ein einzelnes 't' gibt Ihnen nur A oder P) und dasselbe mit 'm', es wird durch ein ersetzt einzelne Ziffer des Protokolls dieses DateTime-Objekts.

Try this:

   var formattedFolderName = validDay.ToString("yyyyMMdd") + "_quote"; 
       var formattedFileName = validDay.ToString($"yyyyMMdd") + securityName + "_minute_quote"; 
+0

Ah ja, natürlich ist es. Diese Formatierung wurde komplett übersehen. Danke! –

Verwandte Themen