Сложить значение недель месяца и разделить на их количество...

Регистрация
05.06.2019
Сообщения
570
Благодарностей
454
Баллы
63
Есть данные в таблице, которые даны в таком виде:
2018-10-07,80
2018-10-14,83
2018-10-21,81
2018-10-28,83
2018-11-04,87
2018-11-11,83
2018-11-18,83
2018-11-25,80
2018-12-02,78
2018-12-09,77
54898f1b-0447-4839-b29c-60b1c56f2cf6.jpg

То есть: неделя, значение
Нужно соединись значения в 1 месяце, и разделились на количество недель в месяце.
В таблице Excel я делаю так, А1+А2+А3+А4/4 получаю среднее число в месяце.

Наброски:
C#:
var list = new List<string>();

//пример списка:
            list.Add("2018-10-07,80"); // значение недели, после запятой
            list.Add("2018-10-14,81");
            list.Add("2018-10-21,81");
            list.Add("2018-10-28,83");
            list.Add("2018-11-04,87");
            list.Add("2018-11-11,83");
            list.Add("2018-11-18,83");
            list.Add("2018-11-25,80");
            list.Add("2018-12-02,78");
            list.Add("2018-12-09,77");

            foreach (var item in list)
            {
                string[] dataValue = item.Split(',');
                DateTime.Parse(dataValue[0]);
            }
 

Вложения

Последнее редактирование:
Регистрация
05.06.2019
Сообщения
570
Благодарностей
454
Баллы
63

Metrix

Client
Регистрация
03.01.2014
Сообщения
343
Благодарностей
272
Баллы
63
И тут никто не въезжает, распиши понятнее, чтобы поняла моя собака.
 
Регистрация
05.06.2019
Сообщения
570
Благодарностей
454
Баллы
63
И тут никто не въезжает, распиши понятнее, чтобы поняла моя собака.
Скачиваю файл в CSV формате, в котором данные (как на картинке)

Пример:
2018-10-07,80
2018-10-14,83
2018-10-21,81
2018-10-28,83
2018-11-04,87
2018-11-11,83
2018-11-18,83
2018-11-25,80
2018-12-02,78
2018-12-09,77

Если внимательно посмотреть, то данные на каждую неделю, идут через (запятую) дата => значение недели.

Конечный результат из полученных данных:
2018-10; 81,75
2018-11; 83,25
2018-12; 77,5

Расчет из формулы: в 1 месяце 4-5 недель, то есть сложить все значения (недель) / на кол-во недель в месяце.
Если смотреть это со стороны таблицы Excel, то: (B1+B2+B3+B4)/4
 
Последнее редактирование:

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93
C#:
var list = new List<string>();

list.Add("2018-10-07,80"); // значение недели, после запятой
list.Add("2018-10-14,81");
list.Add("2018-10-21,81");
list.Add("2018-10-28,83");
list.Add("2018-11-04,87");
list.Add("2018-11-11,83");
list.Add("2018-11-18,83");
list.Add("2018-11-25,80");
list.Add("2018-12-02,78");
list.Add("2018-12-09,77");


IZennoList lst_Result = project.Lists["Result"];
lst_Result.Clear();
List<int> month = new List<int>();

string [] su = {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"};
string dt = string.Empty;
foreach (string m in su) {
    int summ = 0;
    foreach (string s in list) {
        string [] ss = s.Split(new string[] { "," }, StringSplitOptions.None);
        if (DateTime.Parse(ss[0]).ToString("MM") == m) {
            month.Add(Convert.ToInt32(ss[1]));
            dt = DateTime.Parse(ss[0]).ToString("yyyy-MM");
        }
       
    }
   
    foreach (int n in month) {
            summ += n;
        }
   
    if (summ > 0) {
        decimal result = System.Math.Round(Convert.ToDecimal(summ) / Convert.ToDecimal(month.Count), 2);
        lst_Result.Add(dt+"; "+result);
    }
    month.Clear();
}
 
Последнее редактирование:
  • Спасибо
Реакции: Маломальский
Регистрация
05.06.2019
Сообщения
570
Благодарностей
454
Баллы
63
28 строчек кода, а сколько радости они принесли)) Огромное тебе спасибо!

Данные загружались из таблицы CSV формата, добавил в начало:
C#:
IZennoTable table = project.Tables["Таблица 1"];
string column = "A"; //столбец с данными

var list = new List<string>(); //создать коллекцию

//Наполнить коллекцию из таблицы:
for (int i = 2; i < table.RowCount; i++) { //данные из ячейки таблицы, начиная с...

    string cell = table.GetCell(column, i); //взять значение ячейки
    if (!string.IsNullOrEmpty(cell)) { list.Add(cell); //записать ячейку в коллекцию, если она не пустая
    }else{
        continue; //перебрать все строки в столбце
    }
}
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93
Огромное тебе спасибо!
Не за что, предыдущий код будет работать только в пределах одного года, вот код, чтобы со всеми годами работало.

C#:
var list = new List<string>();

list.Add("2018-10-07,80"); // значение недели, после запятой
list.Add("2018-10-14,81");
list.Add("2018-10-21,81");
list.Add("2018-10-28,83");
list.Add("2018-11-04,87");
list.Add("2018-11-11,83");
list.Add("2018-11-18,83");
list.Add("2018-11-25,80");
list.Add("2018-12-02,78");
list.Add("2018-12-09,77");
list.Add("2019-09-04,87");
list.Add("2019-09-11,83");
list.Add("2019-09-18,89");
list.Add("2019-09-25,63");
list.Add("2019-11-04,87");
list.Add("2019-11-11,75");
list.Add("2019-11-18,89");
list.Add("2019-11-25,63");


IZennoList lst_Result = project.Lists["Result"];
lst_Result.Clear();

List<int> lst_summ = new List<int>();
List<string> lst_mm = new List<string>();
List<string> lst_yy = new List<string>();


list.ForEach(rowData => {
    string [] rd = rowData.Split(new string[] { "," }, StringSplitOptions.None);
    
    string MM = DateTime.Parse(rd[0]).ToString("MM");
    string yyyy = DateTime.Parse(rd[0]).ToString("yyyy");
    
    if (lst_mm.Contains(MM)==false) lst_mm.Add(MM);
    if (lst_yy.Contains(yyyy)==false) lst_yy.Add(yyyy);
});

lst_mm.Sort();
lst_yy.Sort();

foreach (string y in lst_yy) {
    foreach (string m in lst_mm) {
        int summ = 0;
        
        list.ForEach(s => {
            string [] ss = s.Split(new string[] { "," }, StringSplitOptions.None);
            if (DateTime.Parse(ss[0]).ToString("yyyy-MM") == y+"-"+m) lst_summ.Add(Convert.ToInt32(ss[1]));
        });

        if (lst_summ.Count > 0) {
            lst_summ.ForEach(n => summ += n);
            decimal result = System.Math.Round(Convert.ToDecimal(summ) / Convert.ToDecimal(lst_summ.Count), 2);
            lst_Result.Add(y+"-"+m+"; "+result);
        }
        lst_summ.Clear();
    }
}
 
  • Спасибо
Реакции: Маломальский
Регистрация
05.06.2019
Сообщения
570
Благодарностей
454
Баллы
63
Не за что, предыдущий код будет работать только в пределах одного года, вот код, чтобы со всеми годами работало.
Код C#
RoyalBank, не знаю как выразить тебе свою благодарность, спасибо что не обошел стороной! Да к тому же уделил столько внимания!

Хочу заметить:
1) Сортировка данных, такая же как и на входе.
2) Работает очень быстро (данные за 5 лет, обработал за 1 мс)
3) Точность вычисления 100%.
 
Последнее редактирование:
  • Спасибо
Реакции: RoyalBank

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)