Member 13264296 Ответов: 2

Как отфильтровать строки csv по диапазону дат в C#


Я использую csvHelper для фильтрации csv-файлов. У меня был код ниже, но я не знаю, как обрабатывать отфильтрованные записи в операторах if. Я хочу написать его снова только строками в пределах диапазона дат.

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

var dFm = new DateTime(2015, 01, 25);
var dTo = new DateTime(2015, 01, 27);
using (var reader = File.OpenText(@"sample.csv"))
{
    var csv = new CsvReader(reader);
    while (csv.Read())
    {
        var date = csv.GetField<DateTime>("Date");
        if (date >= dFm &&
            date <= dTo)
        {
            // process the filtered out records
        }
    }
}

Tomas Takac

Есть класс CsvWriter, попробуйте его использовать. Однако вам нужно писать не в исходный файл, а в другой.

Member 13264296

Нет другого способа переписать данные в тот же каталог?

Richard MacCutchan

Нет, вы не можете перезаписать тот же файл, который вы сейчас читаете.

Member 13264296

Это не очень хорошо для сохранения памяти, особенно если у нас есть много уникальных csv-файлов.

Richard MacCutchan

Это не имеет ничего общего с сохранением памяти.

F-ES Sitecore

Если вы хотите создать дубликат файла без определенных значений, то вы можете записать нужные значения во временный файл (например, если обрабатываемый вами файл xyx.csv, то создайте файл с именем xyz_temp.csv. Когда весь файл будет обработан, удалите исходный файл и переименуйте новый.

Afzaal Ahmad Zeeshan

Можете ли вы получить список объектов или записей? Если это так,то используйте LINQ для фильтрации элементов.

Member 13264296

Это не очень хорошая идея, если у нас есть много csv-файлов для фильтрации.

Afzaal Ahmad Zeeshan

Так или иначе, вы будете перебирать коллекцию.

LINQ не мешает вам использовать несколько файлов (с разными именами файлов).

Member 13264296

Можете ли вы показать мне некоторые коды базы на мой вопрос, потому что я не знаю, как кодировать LINQ.

2 Ответов

Рейтинг:
7

Thomas Nielsen - getCore

Я думаю, что вам нужно понять, что csv-файл изначально является просто "файлом разделенных запятыми вердиктов". В деталях на самом деле он не обязательно разделяется запятой, он разделяется в потоке значением, установленным в системе.Глобализация.Свойство CultureInfo.Свойства currentculture.TextInfo.ListSeparator

Как только вы подумаете об этом, получение ценности из того, что вы прочитали и обработали с любым типом читателя, должно быть прямым. Если вы используете open source CSV reader от Github и он не поддерживает то, что вы хотите, просто раскошелитесь и расширьте его, чтобы иметь возможность.

По сути, вы будете писать в поток, который привязывается к тому же файлу, который вы читали, просто не забудьте закрыть его перед записью, и он вряд ли пойдет не так :)


Member 13264296

Для меня, как для новичка. Мне нужны некоторые примеры и коды, чтобы я мог ясно понять.

Thomas Nielsen - getCore

Например, для взаимодействия с текстовыми файлами: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/file-system/how-to-write-to-a-text-file

кроме того, если вы хотите, чтобы этот человек мог читать и писать: https://github.com/JoshClose/CsvHelper

Рейтинг:
0

RickZeeland

Я никогда не использовал CsvHelper, но при посещении вопросов на странице GitHub я заметил проблему:
Поддержка нескольких форматов дат · выпуск №603 · JoshClose/CsvHelper · GitHub[^]

Прочитав это, я думаю, что для свиданий вам может понадобиться использовать что-то вроде:

TypeConverterOption("yyyyMMdd")

Обновленный ответ:
var dFm = new DateTime(2015, 01, 25);
            var dTo = new DateTime(2015, 01, 27);

            using (var reader = File.OpenText(@"sample.csv"))
            {
                var csv = new CsvReader(reader);

                while (csv.Read())
                {
                    var date = csv.GetField<string>("Date");
                    // See: https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-date-and-time-format-strings
                    var date2 = DateTime.ParseExact(date, "MM/dd/yyyy", null);

                    if (date2 >= dFm && date2 <= dTo)
                    {
                        // process the filtered out records
                        Debug.Print(date2.ToLongDateString());
                    }
                }
            }


Member 13264296

ПРИМЕР ВВОДА:

"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"