2016-06-15 4 views
1

Ich habe eine Liste von CSV-Dateien, in denen die Namenskonvention in yyyymmddhhmm ist .csvFiltering Datum Zeitbereich über Datei csv Namen

201606131800.csv 
201606132000.csv 
201606140100.csv 
201606140300.csv 
201606140500.csv 
201606140700.csv 
201606140800.csv 

Ich brauche eine Datei von gestern 19.00 Uhr bis heute 07.00 Filterung zu tun, wenn heute Datum ist 14. Juni 2016

ich brauche diese csv mit Dateinamen Bereich zu erreichen vom 13. Juni 2016 19.00 Uhr bis 14. Juni 2016 07.00

201606132000.csv 
201606140100.csv 
201606140300.csv 
201606140500.csv 
201606140700.csv 

Ich habe heute ausgewählte Dateien geschrieben. Wie kann ich eine Filterung nach Datum durchführen, die gestern von 19:00 bis 23:59 Uhr einschließt?

string[] FileList = Directory.GetFiles(csvpath, DateTime.Today.ToString("yyyyMMdd") + "*.csv"); 
foreach (var fileName in FileList) 
    { 
    \\file process code. 
} 
+1

ist der Name und die Erstellungszeit für eine bestimmte Datei gleich? –

+0

Der Name ist nicht gleich, aber die Erstellungszeit kann gleich sein. Ich kann die Filterbasis nicht beim Erstellungsdatum verwenden. zB '201606131800.csv - 2016.06.14 1 am' ' 201606132000.csv - 2016.06.14 1 am' '201606140100.csv - 2016.06.14 1 am' – Jonathan

Antwort

0

Wenn der Dateiname und erstellt Datetime gleich sind, dann können Sie den folgenden Code verwenden, um die Liste zu erhalten:

Zum Beispiel Creation für eine Datei 201606132000.csv genannt wird 2016/06/13/ 20:00 und 201606140500.csv sein wird 2016/06/14/ 05:00

DateTime yesterdayTime = DateTime.Now.AddDays(-1).Date.AddHours(19); 
DateTime TodayTime = DateTime.Now.Date.AddHours(7); 
List<FileInfo> FilesBetween7To7 = Directory.GetFiles("your path here") 
              .Select(x => new FileInfo(x)) 
              .Where(y => y.CreationTime > yesterdayTime && 
              y.CreationTime < TodayTime) 
              .ToList(); 

Oder Sie können einen Vergleich mit dem Namen und wählen Sie Dateien mit dem folgenden Snippet;

DateTime yesterdayTime = DateTime.Now.AddDays(-1).Date.AddHours(19); 
DateTime TodayTime = DateTime.Now.Date.AddHours(7); 
List<string> fileList = Directory.GetFiles(csvpath, "*.csv").ToList(); 
List<string> FilesInTheRange = new List<string>(); 
DateTime fileTime; 
foreach (string file in fileList) 
{ 
    if (DateTime.TryParseExact(file.Replace(".csv",String.Empty), "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None, out fileTime)) 
    { 
     if (fileTime >= yesterdayTime && fileTime <= TodayTime) 
      FilesInTheRange.Add(file); 
    } 
} 

FilesInTheRange Willen enthält die erforderlichen Dateien

+0

Nur eine Anmerkung, gibt es Fälle, in denen Die Erstellungsdatumszeit einer Datei ändert sich, wenn beispielsweise eine Datei aus dem Internet heruntergeladen wird. Wenn es sich jedoch um eine lokal erstellte Datei handelt, treten keine Probleme auf. –

+0

@ un-Glück, welche Bibliothek ich verwenden müssen, um dies zu verwenden CultureInfo.InvariantCulture, DateTimeStyles.None – Jonathan

+0

@ Jonathan: 'using System.Globalization;' –

0

Dies ist eine nicht getestete Code, aber Sie würden TryParseExact verwenden möchten, und die Dateinamen in Datetime-Objekte umwandeln und auf der Grundlage Ihrer Start- und End-Datetime vergleichen.

string dateTimeFormat = "yyyyMMddHHmm"; 
string[] FileList = Directory.GetFiles(csvpath, DateTime.Today.ToString("yyyyMMdd") + "*.csv"); 
int startHour = 19; // 7 PM 
int endHour = 7; // 7 AM 
DateTime startDT = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 

DateTime.Now.Day - 1, startHour, 0, 0); 
DateTime endDT = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, endHour, 0, 0); 
foreach (var fileName in FileList) 
{ 
    DateTime fileDT = DateTime.Min; 
    if(DateTime.TryParseExact(fileName, dateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyle.None, out fileDT)) 
    { 
     if(fileDT >= startDT && fileDT <= endDT) 
     { 
      \\file process code. 
     }  
    } 
}