2012-05-05 2 views
0

У меня есть DataTable с тремя столбцамиDataTable в строку

Id name value value1 

Я хочу создать строку из этого DataTable, так что

  1. каждая строка в DataTable создаст две строки
  2. имя будет стать одним рядом
  3. значение 1 станет другим рядом
  4. Если имя и стоимость 1 подобно затем включает в себя значение 1 только в противном случае включает в себя как имя и value1 (это делается)

  5. Если имя одной строки похоже на имя в любой другой строке, а затем добавить следующий текст Infront обоего повторяющихся строк в строке

Id похож на Id

Это то, что я написал до сих пор:

Public Function GetGazetteer(dataTable As DataTable) As String 
      Dim processedData = New List(Of String) 
      Dim rowData = String.Empty 
      Dim results = New StringBuilder() 

      For Each row As DataRow In dataTable.Rows 
       processedData.Add(row(1)) 
       If row(3) <> row(1) Then 
        processedData.Add(row(3)) 
       End If 
      Next 

      For Each row As String In processedData 
       rowData = row 

       If rowData.Trim <> String.Empty Then 
        If (processedData.Where(Function(d) d = rowData).Count = 1) Then 
         results.Append(rowData) 
         results.Append("<br />") 
        Else 
         results.Append(rowData) 
         results.Append("*") 
         results.Append("<br />") 
        End If 
       End If 

      Next 

      Return results.ToString 
     End Function 

В настоящее время * добавляется (пожалуйста, предложите, как добавить указанный текст.)

Вот пример

id name   value value1 
1 this is string 1  abc This is sample 
2 this is string 2  abc this is string 2 
3 this is string 3  abc this is string 4 
4 this is string 3  abc asasaasd 

Здесь желаемый выходного

this is string 1 
This is sample 
this is string 2 
*3 is duplicate of 4* this is string 3 
this is string 4 
*4 is duplicate of 3* this is string 3 
asasaasd 
+0

Дайте некоторые значения таблиц и итоговые значения строк вывода –

+0

@NikhilAgrawal См. Обновленный вопрос – DotnetSparrow

ответ

1

редакция на основании выходного сигнала приведен на вопрос

Это решение с использованием C# (надеюсь, вы можете преобразовать это в VB.NET). Я использовал структуру для хранения информации об идентификаторе, значении, столбце.

структура является

public struct Container 
    { 
     public int Id; 
     public int Col; 
     public string Value; 
    } 

Метод

 public string GetGazetteer(DataTable dtInput) 
     { 
      string result = null; 
      List<Container> containers = new List<Container>(); 
      List<Container> finalContainers = new List<Container>(); 
      StringBuilder sb = new StringBuilder(); 

      foreach (DataRow row in dtInput.Rows) 
      { 
       Container container; 
       container = new Container() { Id = int.Parse(row[0].ToString()), Value = row[1].ToString(), Col = 1 }; 
       containers.Add(container); 
       if (row[1] != row[3]) 
       { 
        container = new Container() { Id = int.Parse(row[0].ToString()), Value = row[3].ToString(), Col = 2 }; 
        containers.Add(container); 
       } 
      } 

      containers = containers.OrderBy(c => c.Value).ThenBy(c => c.Id).ToList(); 

      if (containers.Count > 0) 
      { 
       string initialVal = containers[0].Value; 
       finalContainers.Add(containers[0]); 
       for (int i = 1; i < containers.Count; i++) 
       { 
        if (containers[i].Value == initialVal) 
        { 
         finalContainers.Remove(containers[i]); 
         finalContainers.Remove(containers[i - 1]); 
         finalContainers.Add(new Container() { Id = containers[i - 1].Id, Value = "*" + containers[i - 1].Id + " is duplicate of " + containers[i].Id + "* " + containers[i - 1].Value }); 
         finalContainers.Add(new Container() { Id = containers[i].Id, Value = "*" + containers[i].Id + " is duplicate of " + containers[i - 1].Id + "* " + containers[i].Value }); 
        } 
        else 
        { 
         finalContainers.Add(containers[i]); 
        } 

        initialVal = containers[i].Value; 
       } 

       finalContainers = finalContainers.OrderBy(c => c.Id).ThenBy(c => c.Col).ToList(); 

       foreach (Container container in finalContainers) 
       { 
        sb.Append(container.Value + "</br>"); 
       } 

       result = sb.ToString(); 
      } 

      return result; 
     } 

Это образец DataTable я использовал для тестирования

  DataTable dtInput = new DataTable(); 
      dtInput.Columns.Add("id"); 
      dtInput.Columns.Add("name"); 
      dtInput.Columns.Add("value"); 
      dtInput.Columns.Add("value1"); 

      DataRow drInput1 = dtInput.NewRow(); 
      drInput1[0] = "1"; 
      drInput1[1] = "this is string 1"; 
      drInput1[2] = "abc"; 
      drInput1[3] = "This is sample"; 
      dtInput.Rows.Add(drInput1); 

      DataRow drInput2 = dtInput.NewRow(); 
      drInput2[0] = "2"; 
      drInput2[1] = "this is string 2"; 
      drInput2[2] = "abc"; 
      drInput2[3] = "this is string 2"; 
      dtInput.Rows.Add(drInput2); 

      DataRow drInput3 = dtInput.NewRow(); 
      drInput3[0] = "3"; 
      drInput3[1] = "this is string 3"; 
      drInput3[2] = "abc"; 
      drInput3[3] = "this is string 4"; 
      dtInput.Rows.Add(drInput3); 

      DataRow drInput4 = dtInput.NewRow(); 
      drInput4[0] = "4"; 
      drInput4[1] = "this is string 3"; 
      drInput4[2] = "abc"; 
      drInput4[3] = "asasaasd"; 
      dtInput.Rows.Add(drInput4); 

выход будет

this is string 1</br>This is sample</br>this is string 2</br>*3 is duplicate of 4* this is string 3</br>this is string 4</br>*4 is duplicate of 3* this is string 3</br>asasaasd</br> 
+0

Большое спасибо. Он работал очень хорошо. – DotnetSparrow

+0

Я просто хотел узнать подробности вышеприведенного кода. Во втором цикле, как он проверяет все дубликаты? Проверяет ли оно, что текущее значение не похоже на предыдущее, или текущее значение не дублируется ни на какую запись? – DotnetSparrow

+0

Добро пожаловать. Во втором цикле он фактически проверяет, не совпадает ли текущее значение с предыдущим значением. Но до этого сбор контейнеров в цикле for сначала сортируется по значению, затем по id; поэтому следите за тем, чтобы мы сравнивали правильные значения. –

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