2016-09-24 7 views
0

У меня есть таблица данных с 150 000+ строк и имеет столбец, называемый «номер», который имеет несколько строк, которые имеют один и тот же номер.DataTable с одинаковыми значениями в строках C#

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

id  number weight other_int 
--------------------------------------- 
2  12345  45  5 
3  44556  23  2 
4  12345  335  25 
5  12345  15  455 
... 
... 
1523 12345  615  78 

Колонны с Ид 2,4,5 & 1523 все разделяют номер 12345, и я хочу, чтобы получить/или добавить в список, как это;

//using foreachrow in datatable get unquie values.. 
foreach (DataRow rowData in Datatable.Rows) 
{ 
     //do I add to a temp List<string> here then loop through later using 
     foreach 
} 

//create list that will we will loop through inside sqlite transaction for speed 
List<string> insertToSQL = new List<string>(); 

//Add to insertToSQL using insertToSQL.Add(); 

//for each unique number 
foreach(uniquenumber) { 

    //build insert string 
    string uniquenumber_string = uniquenumber; 
    string uniquenumberCount_string = get number of times uniquenumber appears; 
    string uniquenumbertotalWeightColumn_string = get total value of combined weight column; 

    string insertString = "INSRET INTO dbTable (number, weight,count) values ('" + uniquenumber_string + "','"+ uniquenumbertotalWeightColumn_string +"', '"+ uniquenumberCount_string +"'")"; 
    insertToSQL.Add(insertString) 

} 

Не уверен, что лучший & быстрый способ идти об этом на это должна быть быстрой вставки и удерживать пользователя вверх для до long..less чем за минуту, надеюсь

ответ

0

Найдено решение что очень быстро ...

Создано Список объектов

List<SQLData> _SQLData = new List<SQLData>(); 

Продлайт хруст внутри SQLite сделки ..

   //Initiate database connection 
       string databaseFile = DatabaseFolderPath + @"\database.sqlite"; 
       using (var conn = new SQLiteConnection(
        "Data Source=" + databaseFile + ";")) 
       { 

        conn.Open(); 

        using (var cmd = new SQLiteCommand(conn)) 
        { 
         using (var transaction = conn.BeginTransaction()) 
         { 



          #region foreach row 
          foreach (DataRow rowData in Datatable.Rows) 
          { 

           string number = Convert.ToString(rowData["number"]); 

           //Check in List and/or update item 
           var matchingNumber = _SQlData.FirstOrDefault(_stoItem => (_stoItem.Number == number)); 
            if (matchingNumber != null) 
            { 

             //Number found in List so update count using +1 
             int getLinesCount = matchingNumber.Count + 1; 

             //Update with new amount 
             matchingNumber.Count = getLinesCount; 


            }else{ 

             //Create New Item in String based of Number 


            } 

          } 
          #endregion foreach row 


          #region foreach item in the List 
          foreach (var _item in _SQLData) 
          { 

           cmd.CommandText = "INSERT INTO dbTable (number,count) values ('" + _item.Number + "','" + _item.Count + "')"; 
           cmd.ExecuteNonQuery(); 



          } 
          #endregion foreach item in the List 

         transaction.Commit(); 

         } 

        } 

С несколькими других корректировками я получаю в результате Таблицы базы данных ниже, что экономит мне больше времени в дальнейшем при обращении к этой общей информации, как у меня только для чтения (петлевых 1000+ строк вместо строк в 150,000+ (сырье данные)) в течение ~ 5 секунд при использовании 30+ сек

id  number count(combined) weight(combined) 
--------------------------------------- 
1  12345  4    1,125 
2  44556  2    32 
3  12345  8    2,500 
4  12345  1    455 
... 
... 
23  33456  9    9,924 
Смежные вопросы