Member 13264296 Ответов: 2

Как удалить несколько строк в csv-файле по датам


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);
         }
      }

После просмотра файла из каталога.
ПРИМЕР ВВОДА:
"EmployeeCode","Date","Time","Type"
"3434","01/22/2013","07:54","0"
"3023","01/23/2014","07:54","0"
"2897","01/24/2015","07:54","0"
"3734","01/25/2015","07:54","0"
"3168","01/26/2015","07:54","0"
"4863","01/26/2015","07:55","0"
"2513","01/27/2015","07:55","0"
"2582","01/27/2015","07:55","0"


ВЫХОД:
"EmployeeCode","Date","Time","Type"
"3734","01/25/2015","07:54","0"
"3168","01/26/2015","07:54","0"
"4863","01/26/2015","07:55","0"
"2513","01/27/2015","07:55","0"
"2582","01/27/2015","07:55","0"


Предложения, комментарии, обмен кодами и идеями высоко ценятся.

Что я уже пробовал:

Чтобы преследовать свою цель удаления нескольких строк в csv-файле. Моя идея состоит в том, чтобы получить даты между двумя датами, которые не включены для удаления. Но как я могу перебирать дни между двумя датами и получать там значения в строку и использовать их в своем коде для оценки csv-файла, содержащего это поле?

Maciej Los

Что такое точный ввод? Кажется, вы хотите разделить данные на [" "] (пробел), но пример данных, которые вы опубликовали, разделен запятой [","].

Member 13264296

Все в порядке, никаких проблем с этим вопросом нет, он просто будет перезаписан пустой строкой. Моя проблема заключается в том,как я могу перебирать дни между двумя датами, включая месяцы, дни и год, а затем значения будут вставляться в этот код .Содержит ("значения дат здесь").

Maciej Los

Проверьте мое решение.

2 Ответов

Рейтинг:
2

Maciej Los

Предположим, что данные разделены пробелом...

Предположим, что данные заключены в двойную кавычку и разделены запятой...

string[] lines = {@"""EmployeeCode"",""Date"",""Time"",""Type""",
	@"""3434"",""01/22/2013"",""07:54"",""0""",
	@"""3023"",""01/23/2014"",""07:54"",""0""",
	@"""2897"",""01/24/2015"",""07:54"",""0""",
	@"""3734"",""01/25/2015"",""07:54"",""0""",
	@"""3168"",""01/26/2015"",""07:54"",""0""",
	@"""4863"",""01/26/2015"",""07:55"",""0""",
	@"""2513"",""01/27/2015"",""07:55"",""0""",
	@"""2582"",""01/27/2015"",""07:55"",""0"""};

DateTime dFm  = new DateTime(2015, 1, 25);
DateTime dTo  = new DateTime(2015, 1, 27);

var data = lines
	.Skip(1)
	.Select(x=> new
	{
		EmpCode = Int32.Parse(x.Split(new string[]{@""",""", @""""}, StringSplitOptions.RemoveEmptyEntries)[0]),
		Date = DateTime.ParseExact(
			string.Concat(x.Split(new string[]{@""",""", @""""}, StringSplitOptions.RemoveEmptyEntries)[1], " ",
				x.Split(new string[]{@""",""", @""""}, StringSplitOptions.RemoveEmptyEntries)[2]),
			"MM/dd/yyyy HH:mm", System.Globalization.CultureInfo.InvariantCulture),
		Type = x.Split(new string[]{@""",""", @""""}, StringSplitOptions.RemoveEmptyEntries)[3]
	})
	.Where(x=>x.Date>=dFm && x.Date<=dTo)
	.ToList();


Результат:
3734 2015-01-25 07:54:00 0 
3168 2015-01-26 07:54:00 0 
4863 2015-01-26 07:55:00 0 


Удачи вам!


Member 13264296

Ошибка: формат не похож на формат в выходном образце. Формат моего csv-файла похож на мой пример ввода выше. Время - это отдельная колонка.

Maciej Los

Решение было обновлено.

Member 13264296

Ошибка: индекс находился за пределами массива, и кажется, что в строке нет столбца времени, потому что это отдельный столбец, а также отдельный ввод пользователем.

Maciej Los

Я протестировал вышеописанный код на основе ваших данных, и там нет никаких ошибок.

Member 13264296

Извините за очень поздний ответ по какой-то причине. Я объявляю такие строки. var lines = System. IO. File.ReadAllLines (txtFileName. Text);

Ошибка: {"индекс находился за пределами массива".} ошибка CS1525: недопустимый термин выражения' {'

Maciej Los

Кажется, ты не понимаешь... Я ленив и не хочу создавать никаких файлов. Как я уже упоминал в ответе, линии переменная хранит точное содержимое вашего csv-файла.
Что касается Вашего сообщения об ошибке, проверьте это: Ошибка компилятора CS1525[^]

Member 13264296

Извините, я загружаюсь и, наконец, понимаю. Но это не отвечает моей проблеме, потому что каждый день у меня были разные файлы в csv-файлах, которые отправлялись на мой компьютер. Это заняло тысячи лет после удаления различных csv-файлов. хе-хе. Но спасибо за ваш ответ и усилия, я действительно ценю это и прошу прощения за мою загруженную память.

Рейтинг:
1

RickZeeland

Я думаю, что ваше утверждение DateTime неверно и должно выглядеть так:

DateTime start = new DateTime(2015, 1, 25);
Console.WriteLine("Date = " + start);
Console.WriteLine("Date = " + start.ToShortDateString());
Буду давать:
Дата = 1/25/2015 12: 00: 00
Дата = 1/25/2015

Обновленный Пример:
using System;
using System.Linq;
using System.Collections.Generic;
					
public class Program
{
	public static void Main()
	{
		DateTime start = new DateTime(2015, 1, 25);
		DateTime end = new DateTime(2015, 1, 27);
		
		var dates = new List<DateTime>();
		var oldLines = new List<string> { "01/25/2015", "01/26/2015", "01/27/2015", "01/28/2015" };
		var newLines = new List<string>();
		
		for (var dt = start; dt <= end; dt = dt.AddDays(1))
        {
        	dates.Add(dt);
		}
		
		foreach(var d in dates)
		{
			newLines.AddRange(oldLines.Where(line => line.Contains(d.ToShortDateString())));
		}
		
		Console.WriteLine(newLines.Count());
	}
}


Member 13264296

Как я могу использовать его в своем коде?

Member 13264296

Это всего лишь один ряд.

RickZeeland

Да :) вам придется закончить код самостоятельно ...

Member 13264296

хе-хе. хорошо, но вы не повторяли даты между двумя датами.

Member 13264296

Что делать, если дата из 2 datetimepicker.