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

ParfeniyAnton

Client
Регистрация
24.08.2014
Сообщения
310
Реакции
50
Баллы
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;
                    }                   
            }
}
 
Так скиньте архив с куском шаблона где этот код прописан и прикреплена сразу таблица со скриншота, а то на чем нам тестить?
 
  • Спасибо
Реакции: ParfeniyAnton

Вложения

Всё ещё нужна помощь. Готов финансово вознаградить.
 
завтра бесплатно скину. Самому интересно стало, так как как раз с таблицами работаю.
 
  • Спасибо
Реакции: Roman*
Сырой вариант:
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;
                    }                   
            }
}
 
В таблице строки в которых заполнена ячейка "Цена %" идут через одну.
Поэтому ваш код обрабатывает первую строку и на второй вылетает по break :)
 
Всем спасибо. Код доделал сам.
Нужно было сделать проверку на пустые значения. В некоторых ячейках были пустые значения и они выдавали ошибку при попытке конвертации в int.
 
  • Спасибо
Реакции: Koqpe

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