2015-11-05 2 views
0

У меня есть два datatables в моем приложении ASP.NET, которые заполнены из файлов csv, и я пытаюсь объединить их в один.Объединение двух C# datatables в один

Вот что интерфейс выглядит следующим образом:

enter image description here

При нажатии на кнопку «Объединение данных» должно объединить test1.csv и test2.csv, какой вид работ, но выглядит следующим образом: enter image description here

Итак, мой вопрос заключается в том, как выровнять эти два типа данных так, чтобы все данные находились в одной строке?

Ниже приведен код для кнопки Merge данных:

 List<string> filepaths = new List<string>(); 
     List<DataTable> allTables = new List<DataTable>(); 
     DataTable mergedTables = new DataTable(); 
     int rowCount = grdFiles.Rows.Count; 

     for (int i = 0; i < rowCount; i++) 
     { 
      string filename = grdFiles.Rows[i].Cells[0].Text; 
      filepaths.Add(Server.MapPath("~/Uploads/") + filename); 
     } 

     foreach(string path in filepaths) 
     { 
      DataTable dt = new DataTable(); 
      //converts csv into datatable 
      dt = GetDataTableFromCsv(path, true); 
      //add table to list of tables 
      allTables.Add(dt); 
     } 

     foreach(DataTable datatable in allTables) 
     { 
      //Merge each table in the list to the mergedTables datatable 
      mergedTables.Merge(datatable); 
     } 
     csvUploadResults.DataSource = mergedTables; 
     csvUploadResults.DataBind(); 

Заранее спасибо за любую помощь :)

enter image description here

+0

Связаны ли обе таблицы с каким-то уникальным ключом? – Prabhat

+0

Нет, данные в таблицах связаны, но не имеют ключей. –

+1

Тогда как вы планируете слияние? Как вы знаете, как подключить строку из test1 к строке в test2? – Kvam

ответ

3

Если ваша цель - объединить данные без учета взаимосвязи между двумя данными, вы можете добавить еще два столбца в первый тип данных и через цикл получить данные из второй таблицы и назначить их первым столбцам данных. Способ получения данных будет способом сохранения данных в первом формате данных.

public DataTable MergeData(DataTable dtFirst,DataTable dtSecond) 
{ 
    dtFirst.Columns.Add("LocalAuthority"); 
    dtFirst.Columns.Add("AverageSpeed"); 
    for (int i = 0; i < dtFirst.Rows.Count; i++) 
    { 
     dtFirst.Rows[i]["LocalAuthority"] = dtSecond.Rows[i]["LocalAuthority"]; 
     dtFirst.Rows[i]["AverageSpeed"] = dtSecond.Rows[i]["AverageSpeed"]; 
    } 
    return dtFirst; 
} 

Теперь вам необходимо передать datatable в качестве параметра в следующем методе.

MergeData(allTables.ElementAt(0), allTables.ElementAt(1)); 
+0

Работал отлично, красиво и просто, именно то, что я искал. Спасибо :) –

+0

очень краткое описание. =) +10 – Ian

0

Вы будете нуждаться уникальный ключ на обоих DataTables и merge them together. Вы можете добавить SchoolName к своему второму datatable и объединить две таблицы в почтовом индексе. Или, более предпочтительно, добавьте идентификатор к обоим типам данных и объедините два типа данных в идентификаторе.

+0

Я не знал, что для двух данных необходимо, чтобы общий столбец правильно сливался. Знаете ли вы какие-либо ресурсы, которые показывают вам, как это делается? –

+0

Если бы вы могли дать некоторую информацию о том, откуда взялись данные, я мог бы найти решение для вас. Создавали ли данные в коде C#? Они исходят из запроса SQL select? Понятия не имею. – Janneman96

+0

Есть еще очень дешевое решение этой проблемы, вы можете [добавить идентификатор в обе таблицы после их создания] (http://stackoverflow.com/questions/2839168/how-to-add-identity-column-to-datatable -using-c-sharp) и объединить их по этому id. – Janneman96

Смежные вопросы