Не понятная ошибка в C#

ParfeniyAnton

Client
Регистрация
24.08.2014
Сообщения
301
Благодарностей
49
Баллы
28
Привет, ребзя.
Есть таблица с такими данными:
upload_2018-4-13_2-59-36.png

Пытаюсь сделать скрипт, который будет анализировать данные и удалять строки в двух ситуациях:

1. Если в столбце "Цена%" значение меньше чем заданное значение ( я беру не меньше 3-х), в таком случае из скриншота удалились бы все строки, кроме строк 1 и 2. К каждой строке типа ADA\BTC идёт ниже строка 24V - они удаляются парами.

2. В случае если значение в столбце "Цена%" больше чем заданное, то нужно взять значения из строки ниже и сравнить их с заданным значением. Тут внимательно - в первой строке находим ячейку со значением "Min", и берём значение из ячейки прямо под ней, так же делаем с "Max".
И в случае если одно из этих двух значений будет меньше заданного то так же удаляем 1 и 2 строки.

Я намутил такой код, но он не работает - выдаёт "Ошибка. Входная строка имела неверный формат". При этом, если именно в первом месте кода где есть
final.DeleteRow(i);
final.DeleteRow(i);
i = i - 1;
заменить этот кусок на что угодно, например на return "yes"; то код работает и не выдаёт ошибку.

Код:
var final = project.Tables["final"];
var min_volume = Convert.ToInt32(project.Variables["min_volume"].Value);
var precent_settings = Convert.ToInt32(project.Variables["precent"].Value);

for(int i = 1; i< final.RowCount; i++){
   
        var final_row = final.GetRow(i).ToArray();
        var precent_count = final_row.Length - 2;
        var precent_int = Int32.Parse(final.GetCell(precent_count, i));
   
            if ( precent_int < precent_settings ){
                final.DeleteRow(i);
                final.DeleteRow(i);           
                i = i - 1;
            }
            else{
                var min_index = Array.IndexOf(final_row, "Min");
                var max_index = Array.IndexOf(final_row, "Max");
                var min_price_volume = Convert.ToInt32(final.GetCell(min_index, i + 1).Replace(",",""));
                var max_price_volume = Convert.ToInt32(final.GetCell(max_index, i + 1).Replace(",",""));
                    if( min_price_volume < min_volume || max_price_volume < min_volume){
                        final.DeleteRow(i);
                        final.DeleteRow(i);           
                        i = i - 1;
                    }                   
            }
}
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
Так скиньте архив с куском шаблона где этот код прописан и прикреплена сразу таблица со скриншота, а то на чем нам тестить?
 
  • Спасибо
Реакции: ParfeniyAnton

ParfeniyAnton

Client
Регистрация
24.08.2014
Сообщения
301
Благодарностей
49
Баллы
28

Вложения

ParfeniyAnton

Client
Регистрация
24.08.2014
Сообщения
301
Благодарностей
49
Баллы
28
Всё ещё нужна помощь. Готов финансово вознаградить.
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
завтра бесплатно скину. Самому интересно стало, так как как раз с таблицами работаю.
 
  • Спасибо
Реакции: Roman*

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
Сырой вариант:
C#:
IZennoTable final = project.Tables["final"];
int min_volume = Convert.ToInt32(project.Variables["min_volume"].Value);
int precent_settings = Convert.ToInt32(project.Variables["precent"].Value);
int precent_int = 0;
int precent_count = 0;
// ищем номер столбца с заголовкjм Цена %. Начало:
var stroka_zagolovka = final.GetRow(0).ToArray();
for (int i=0; i < stroka_zagolovka.Length; i++)
{
    if (stroka_zagolovka[i] == "Цена %")
    {
        precent_count = i;
        break;
    }
}



project.SendInfoToLog("столбец с ценой= " + precent_count.ToString(), true);

for(int i = 1; i< final.RowCount; i++)
{
   
        var final_row = final.GetRow(i).ToArray();
        try
    {
        precent_int = Int32.Parse(final.GetCell(precent_count, i));
    }
    catch
    {
        project.SendInfoToLog("не смогли считать цифровое значение из ячейки, значение =" + final.GetCell(precent_count, i), true);
        break;
    }
               
            if ( precent_int < precent_settings ){
                final.DeleteRow(i);
                final.DeleteRow(i);           
                i = i - 1;
            }
            else{
                var min_index = Array.IndexOf(final_row, "Min");
                var max_index = Array.IndexOf(final_row, "Max");
                var min_price_volume = Convert.ToInt32(final.GetCell(min_index, i + 1).Replace(",",""));
                var max_price_volume = Convert.ToInt32(final.GetCell(max_index, i + 1).Replace(",",""));
                    if( min_price_volume < min_volume || max_price_volume < min_volume){
                        final.DeleteRow(i);
                        final.DeleteRow(i);           
                        i = i - 1;
                    }                   
            }
}
 

ParfeniyAnton

Client
Регистрация
24.08.2014
Сообщения
301
Благодарностей
49
Баллы
28
В таблице строки в которых заполнена ячейка "Цена %" идут через одну.
Поэтому ваш код обрабатывает первую строку и на второй вылетает по break :-)
 

ParfeniyAnton

Client
Регистрация
24.08.2014
Сообщения
301
Благодарностей
49
Баллы
28
Всем спасибо. Код доделал сам.
Нужно было сделать проверку на пустые значения. В некоторых ячейках были пустые значения и они выдавали ошибку при попытке конвертации в int.
 
  • Спасибо
Реакции: Koqpe

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