Как использовать второе вхождение данных для обновления первого вхождения в базу данных, читая необработанные данные из текстового файла C # - PullRequest
0 голосов
/ 28 октября 2019

У меня есть данные CSV в текстовом файле, как показано ниже. Я читаю текстовый файл построчно, разбив каждую строку на массив (например. strArray ). Я хочу сохранить Equal strArray [0] в базе данных в виде одной строки.

00001,07: 57 010619,1,001
00003,07: 58 010619,1,001
00002,08: 30,010619,1001
00004,08: 29,010619,1,001
00003,20: 14,010619,1,001
00003,08: 14,010619,1,001
00001, 18: 02,010619,1001
00002,18: 00,010619,1,001
00003,18: 03,010619,1,001

Вот как я читаю файл.

List<Data_Obj> Data_List= new List<Data_Obj>();
using (StreamReader sr = new StreamReader(dir))
{
    while (sr.Peek() >= 0)
    {
        String str;
        string[] strArray;
        str = sr.ReadLine();

        strArray = str.Split(',');
        Data_Obj obj= new Data_Obj();
        obj.card= strArray[0];
        obj.time = strArray[1];
        obj.day = Int32.Parse(strArray[2].Substring(0, 2));
        obj.mon = Int32.Parse(strArray[2].Substring(2, 2));
        obj.yr = Int32.Parse(strArray[2].Substring(4, 2));
        obj.DeviceNo = Int32.Parse(strArray[3]);
        obj.DeviceID = strArray[4];
        Data_List.Add(obj);
    }


}

Теперь таблица базы данных должна выглядеть следующим образом

| Card   |EnTime |ExTime | Device| Time     |
-------------------------------------------
|00001   |07:57  | 18:02 |   1   |01/06/2019|
|00003   |07:58  | 20:14 |   1   |01/06/2018|
|00002   |08:30  | 18:00 |   1   |01/06/2018|
|00004   |08:29  |       |   1   |01/06/2018|
|00003   |08:14  | 18:03 |   1   |01/06/2018|

Мне нужна помощь, как это сделать.

1 Ответ

0 голосов
/ 28 октября 2019

После моего комментария код должен выглядеть примерно так:

Dictionary<string, Data_Obj> Data_Dictionary= new Dictionary<string, Data_Obj>();
using (StreamReader sr = new StreamReader(dir))
{
    while (sr.Peek() >= 0)
    {
        String str;
        string[] strArray;
        str = sr.ReadLine();

        strArray = str.Split(',');
        Data_Obj obj;
        if(!Data_Dictionary.ContainsKey(strArray[0])
        {
            obj = new Data_Obj();
            obj.card= strArray[0];
            obj.time = strArray[1];
            obj.day = Int32.Parse(strArray[2].Substring(0, 2));
            obj.mon = Int32.Parse(strArray[2].Substring(2, 2));
            obj.yr = Int32.Parse(strArray[2].Substring(4, 2));
            obj.DeviceNo = Int32.Parse(strArray[3]);
            obj.DeviceID = strArray[4];
            Data_Dictionary.Add(obj.card, obj);
        }
        else
        {
            obj = Data_Dictionary[strArray[0]];
            // Change data here
        }
    }
}

Вам нужно только применить необходимые изменения к уже существующему Data_Obj ...

РЕДАКТИРОВАТЬ:

Я заметил, что у вас нет обеих временных меток в вашем объекте ... Может быть, вы можете расширить свой класс Data_Obj, чтобы иметь две временных метки (ваши EnTime и ExTime).

ОБНОВЛЕНИЕ:

Я бы порекомендовал вам использовать два объекта DateTime в вашем классе. 1st .: EnTime 2nd .: ExTime Они могут заменить свойства / поля времени, дня, понедельника и года.

, тогда вы можете сделать:

Dictionary<string, Data_Obj> Data_Dictionary= new Dictionary<string, Data_Obj>();
using (StreamReader sr = new StreamReader(dir))
{
    while (sr.Peek() >= 0)
    {
        String str;
        string[] strArray;
        str = sr.ReadLine();

        strArray = str.Split(',');
        Data_Obj obj;
        if(!Data_Dictionary.ContainsKey(strArray[0])
        {
            obj = new Data_Obj();
            obj.card= strArray[0];
            if(int.TryParse(strArray[1].Split(':')[0], out int hour) == true) &&
               int.TryParse(strArray[1].Split(':')[1], out int minute) == true) &&
               int.TryParse(strArray[2].Substring(0, 2), out int day) == true) &&
               int.TryParse(strArray[2].Substring(2, 2), out int month) == true) &&
               int.TryParse(strArray[2].Substring(4, 2), out int year) == true)
            {
                obj.EnTime = new DateTime(year,month, day, hour, minute, 0, 0);
                obj.ExTime = DateTime.MinValue;
            }
            else
            {
                throw new FormatException("Format of dataLine must be: 00001,07:57,010619,1,001");
            }

            obj.DeviceNo = Int32.Parse(strArray[3]);
            obj.DeviceID = strArray[4];
            Data_Dictionary.Add(obj.card, obj);
        }
        else
        {
            obj = Data_Dictionary[strArray[0]];
            if(int.TryParse(strArray[1].Split(':')[0], out int hour) == true) &&
               int.TryParse(strArray[1].Split(':')[1], out int minute) == true) &&
               int.TryParse(strArray[2].Substring(0, 2), out int day) == true) &&
               int.TryParse(strArray[2].Substring(2, 2), out int month) == true) &&
               int.TryParse(strArray[2].Substring(4, 2), out int year) == true)
            {
                DateTime currentValue = new DateTime(year,month, day, hour, minute, 0, 0);
                if(obj.EnTime <= currentValue)
                {
                    if(currentValue > obj.Extime)
                    {
                        obj.ExTime = currentValue;
                    }
                }
                else
                {
                    if(obj.EnTime > obj.Extime)
                    {
                        obj.ExTime = obj.EnTime;
                    }

                    obj.EnTime = currentValue;
                }
            }
            else
            {
                throw new FormatException("Format of dataLine must be: 00001,07:57,010619,1,001");
            }
        }
    }
}

Помните, что вам следует добавить некоторыепроверяет операции разбиения и подстроки. Они выдают исключение, если формат неправильный ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...