2012-06-25 5 views
0

필자는 두 개의 datatable을 가지고 있으며 각 datatables의 zipcode를 일치시켜야하며 프로그램이 매치를 찾을 때마다 일치하는 행의 열을 문자열로 설정해야합니다. 내 코드는 다음과 같습니다.어떻게 두 개의 데이터 테이블과 일치하는 값을 취한 다음 일치하는 행 값의 열에 무언가를 추가합니까?

foreach 루프에서 수행해야 할 작업을 알지 못하거나이 작업을 수행하기 쉬운 방법이 있다면 알려주십시오.

 //Datatable for entire list of zipcodes 
     DataTable datat = new DataTable("DATA"); 
     DataColumn state = new DataColumn(); 
     DataColumn county = new DataColumn(); 
     DataColumn zipcode = new DataColumn(); 
     DataColumn latitude = new DataColumn(); 
     DataColumn longitude = new DataColumn(); 
     DataColumn salesperson = new DataColumn(); 
     DataColumn originalrec = new DataColumn(); 

     //Add the columns to the datatable 
     datat.Columns.Add(state); 
     datat.Columns.Add(county); 
     datat.Columns.Add(zipcode); 
     datat.Columns.Add(latitude); 
     datat.Columns.Add(longitude); 
     datat.Columns.Add(salesperson); 
     datat.Columns.Add(originalrec); 

     return datat; 
    } 

    private static DataTable InitData2() 
    { 
     //Datatable for entire list of zipcodes 
     DataTable datat2 = new DataTable("DATA"); 
     DataColumn ctype = new DataColumn(); 
     DataColumn csalesperson = new DataColumn(); 
     DataColumn czipcode = new DataColumn(); 

     //Add the columns to the datatable 
     datat2.Columns.Add(ctype); 
     datat2.Columns.Add(csalesperson); 
     datat2.Columns.Add(czipcode); 

     return datat2; 
    }  

    private static String InitPath() 
    { 
     string path = "C:/Documents and Settings/Andre/Desktop/SalesMap/data.csv"; 
     return path; 
    } 

    private static String InitPath2() 
    { 
     string path2 = "C:/Documents and Settings/Andre/Desktop/SalesMap/CUSTOMER_PROSPECT_SALESPERSON.csv"; 
     return path2; 
    } 

    public static void Main() 
    { 
     try 
     { 
      DataTable dt = InitData1(); 
      DataTable dt2 = InitData2(); 
      StreamReader sr = new StreamReader(InitPath()); 
      StreamReader sr2 = new StreamReader(InitPath2()); 
      String csvData = string.Empty; 
      String csvData2 = string.Empty; 

      while ((csvData = sr.ReadLine()) != null) 
      { 
       String[] data = csvData.Split(','); 
       //dt.Rows.Add(data); 
       DataRow newRow1 = dt.NewRow(); 
       newRow1[0] = data[0].ToString(); 
       newRow1[1] = data[1].ToString(); 
       newRow1[2] = data[2].ToString(); 
       newRow1[3] = data[3].ToString(); 
       newRow1[4] = data[4].ToString(); 
       newRow1[5] = ""; 
       newRow1[6] = ""; 
       dt.Rows.Add(newRow1); 

       Console.WriteLine("Row added for: dt"); 
      } 
      dt.WriteXml(@"c:\test\dt1.xml"); 
      sr.Close(); 

      while ((csvData2 = sr2.ReadLine()) != null) 
      { 
       String[] data2 = csvData2.Split(','); 
       DataRow newRow2 = dt2.NewRow(); 
       newRow2[0] = data2[0].ToString(); 
       newRow2[1] = data2[1].ToString(); 
       newRow2[2] = data2[2].ToString(); 
       dt2.Rows.Add(newRow2); 

       Console.WriteLine("Row added for: dt2"); 
      } 

      dt2.WriteXml(@"c:\test\dt2.xml"); 
      sr2.Close(); 

      foreach (DataRow row1 in dt.Rows) 
      { 
       //Dont know what to do here 
      } 
     } 

     catch (Exception e) 
     { 
      //Console.WriteLine("The files could not be read:"); 
      //Console.WriteLine(e.Message); 
      StreamWriter sw = new StreamWriter(@"c:\test\error.txt"); 
      sw.WriteLine(e.Message); 
      sw.Close(); 


     } 
    } 
} 
} 
+0

어떤 수업입니까? – tsells

+0

foreach 루프를 만들려고했지만 어떻게 할 수 있는지 파악할 수 없었습니다. 나는 foreach를 다른 foreach 내부에 중첩시켜야 할 것이라고 추측하고 있지만, 어떻게하는지에 대해서는 확신 할 수 없다. 또한, 이것은 수업을위한 것이 아니라 내가 친구와 함께하고있는 프로젝트를위한 것입니다. –

+0

@AdamAndre : 스택 오버플로는 사용중인 코드를 표시 할 때 가장 효과적입니다. 그것이 작동하지 않더라도. – user7116

답변

3

전혀 이해하지 못했습니다. 내가 모습을 상상할 수 그러나 그것은 다음과 같이해야합니다 : 당신은 아무것도 필요하면 연락을하겠습니다

  DataTable dtSampleOne = new DataTable(); 
      DataTable dtSampleTwo = new DataTable(); 

      foreach (DataRow rowSampleOne in dtSampleOne.Rows) 
      { 
       string zipCodeSampleOne = rowSampleOne["zipCodeToMatchOne"].ToString(); 

       foreach (DataRow rowSampleTwo in dtSampleTwo.Rows) 
       { 
        if (rowSampleTwo["zipCodeToMatchTwo"].ToString().Equals(zipCodeSampleOne)) 
        { 
         // Do your stuff here 
        }        
       } 
      } 

.

+0

작동 여부에 관계없이이 코드를 사용해 보겠습니다. 대답 해줘서 고마워! 그리고 미안 해요, 나는 다소 혼란 스럽다는 것을 압니다. 오랫동안이 질문을하는 방법을 생각해야했기 때문입니다. –

+0

당신이보고 싶으면 내 코드를 추가했습니다. –

+1

필자가 제공 한 샘플이 해당 작업을 수행해야합니다 (관련 수정 사항 포함). 또한 일치하는 결과를 관리하는 세 번째 데이터 테이블을 제안합니다. –

0

가장 쉬운 방법은 저장 프로 시저에서 모두 수행하는 것입니다. 따라서 저장 프로 시저는 간단한 일치 (아마도 intersect 사용)를 수행하고 결과를 반환합니다. 저장 프로 시저를 사용할 수 없다면 두 세트를 모두 선택하여 Lists에로드 한 다음 LINQ 명령을 사용하여 Intersect를 수행 할 수 있습니다. foreach 루프가 필요 없습니다. 이 작업을 수행하지만

List<string> list1 = // load list from db 
List<string> list2 = // load second list from db 

var result = list1.Intersect(list2); 

이 LINQ를 사용하여

0

, 우리는 더 루이스 에르난데스에 의해 주어진 코드를 향상시킬 수 있습니다.

주어진 솔루션 (Luis Hernández)에서 우리는 2 개의 루프를 가지고 있습니다. SampleOne을 100 행으로, SampleTwo를 200 행으로 가정합니다. 우리는 100 X 200 번 루핑으로 끝날 것입니다!

대신 일치하는 레코드를 얻을 수 있으며 해당 레코드 만 루프 할 수 있습니다. 이렇게하면 불필요한 루프를 피할 수 있습니다.

 var sampleOne = new DataTable(); 
     var sampleTwo = new DataTable(); 

     // TODO : I assume these two table have the common column "ZipCode". 
     // TODO : Add your sample data here! 

     var matchingRows = from s1 in sampleOne.AsEnumerable() 
          join s2 in sampleTwo.AsEnumerable() on s1.Field<string>("ZipCode") equals s2.Field<string>("ZipCode") 
          select s1; 

     foreach (var row in matchingRows) 
     { 
      // Do your stuff here ! 
     } 

나의 해결책은 마크까지하지 않으면 나에게 알려 주시기 바랍니다!