2017-06-17 7 views
0

Um mein Ziel zu verfolgen, mehrere Zeilen in CSV-Datei zu löschen. Meine Idee ist, die Daten zwischen zwei Daten zu erhalten, die nicht zum Löschen gehören. Aber wie kann ich Tage zwischen zwei Daten wiederholen und bekomme Werte zu string und verwendet zu meinem Code für die Bewertung der CSV-Datei, die dieses Feld enthält.Mehrere löschen in CSV-Zeilen nach Daten

private void button2_Click(object sender, EventArgs e) 
    { 
    DateTime start = new DateTime(01/25/2015); 
    DateTime end = new DateTime(01/27/2015); 

    var dates = new List<DateTime>(); 

    for (var dt = start; dt <= end; dt = dt.AddDays(1)) 
    { 
     dates.Add(dt); 

     var oldLines = System.IO.File.ReadAllLines(txtFileName.Text); 
     var newLines = oldLines.Where(line => 
     line.Contains(dates.ToString()));   
     System.IO.File.WriteAllLines(txtFileName.Text, newLines); 

     newLines = oldLines.Select(line => new 

     { 
      Line = line, 
      Words = line.Split(' ') 
     }) 
     .Where(lineInfo => lineInfo.Words.Contains(dates.ToString())) 
     .Select(lineInfo => lineInfo.Line); 
    } 
    } 

INPUT:

"EmployeeCode", "Datum", "Zeit", "Typ"
"3434", "2013.01.22", "7.54", "0 "
" 3023 "," 23.01.2014 "," 07:54 "," 0 "
" 2897 "," 01/24/2015 "," 07:54 "," 0 "
" 3734 "," 25.01.2015 "," 07:54 "," 0 "
" 3168 "," 26.01.2015 "," 07:54 "," 0 "
" 4863 "," 26.01.2015 "," 07:55 "," 0 "
"2513", "2015.01.27", "7.55", "0"
"2582", "2015.01.27", "7.55", "0"

OUTPUT:

"EmployeeCode", "Datum", "Zeit", "Typ"
"3734", "2015.01.25", "7.54", "0"
"3168", "26.01.2015", "07:54", "0"
"4863", "26.01.2015", "07:55", "0"
"2513", "01/27/2015 "," 07:55 "," 0 "
" 2582 "," 27.01.2015 "," 07:55 "," 0 "

Anregungen, Kommentare, Austausch von Codes und Ideen werden sehr geschätzt.

+0

Es wäre hilfreich, wenn Sie eine Beispiel-Eingabedatei und eine Beispiel-Ausgabedatei (wobei die Beispiel-Ausgabedatei die Ausgabedatei ist, die Sie ** sehen möchten ** am Ende geschrieben) sehen. – mjwills

+0

Gibt es einen Grund, dass Sie 'newLines' ** nach dem Schreiben der Datei einen Wert zuweisen? – mjwills

+0

Ja, das ist der Grund, warum wir diese Zeilen mit leeren Zeilen überschreiben können, die Daten enthalten, die den Datumsbereich nicht enthalten. Ich bearbeite meinen Beitrag, um Ein- und Ausgabe zu sehen. – LovExpert

Antwort

1

Ein typischerer Weg wäre, über alle Zeilen zu schauen, die relevanten Teile zu extrahieren, sie in tatsächliche Daten zu konvertieren und diese mit Ihren Start- und Enddaten mit regelmäßigen Ungleichungen zu vergleichen.

private void button2_Click(object sender, EventArgs e) 
{ 
    DateTime start = new DateTime(2015,01,26); 
    DateTime end = new DateTime(2015,01,27); 

    var oldLines = System.IO.File.ReadAllLines(txtFileName.Text); 
    var newLines = oldLines 
     .Select(line => new { line, date = DateTime.Parse(line.Split(',')[1]) }) 
     .Where(line => line.date > start and line.date < end) 
     .Select(line => line.line) 
     .ToArray(); 

    System.IO.File.WriteAllLines(txtFileName.Text, newLines); 
} 

Dies berücksichtigt nicht die Kopfzeile, aber Sie können das separat behandeln.

+0

Woher kommt die Datumsvariable? (Und Zeile) -> existiert im aktuellen Kontext nicht. Fehlercode bitte bearbeiten. Ich habe wirklich keine Idee. – LovExpert

+0

Opps habe ich ein "neues" vor dem anonymen Objekt vergessen. (Tut mir leid, nicht in diesem Editor zu tun, nur in diesem Fenster) –

+0

Diese Zeile hat Fehler ".Wählen (Zeile => neu {Zeile, Datum = DateTime.Parse (line.Split (',') [1])}) "-----> Sagt: System.FormatException: 'String wurde nicht als gültige DateTime erkannt. – LovExpert

Verwandte Themen