2015-09-14 76 views
-5

我有兩個文本文件是這樣的:閱讀兩個文本文件,並加入列在一個DataGridView C#

文本文件1:

Campionato;Data;Home;Away;HSFT;ASFT;HSHT;HSHT 
DenDiv1;07.09.2015;Silkeborg;Helsingor;1;0;0;0 
DenDiv1;06.09.2015;Naestved;Roskilde;1;1;0;0 
DenDiv1;06.09.2015;Lyngby;Vejle;3;2;2;0 

文本文件2:

Data;Home;Away;HODD;AODD 
07.09.2015;Silkeborg;Helsingor;1.50;4.09;5.71 
06.09.2015;Naestved;Roskilde;2.54;3.20;2.63 
06.09.2015;Lyngby;Vejle;2.12;3.33;3.20 

我需要加入並在datagridview中顯示它們。請問你能幫幫我嗎?謝謝! :)

更新:主頁和客場列都是我的主要關鍵。

+0

讀取文本文件或將結果綁定到gridview有問題嗎?向我們展示你到目前爲止所嘗試過的。 – Bgl86

+0

創建一個具有所有必需屬性(來自兩個文件)的數據類;將這兩個文件讀取到內存中(可能是手動編寫爲'List '或使用例如Lumenworks CSV閱讀器)。然後通過使用LINQ和創建數據類實例來加入這兩個列表。將這些實例放入用作數據網格視圖的數據源的列表中。如果這些步驟中的任何一個遇到麻煩,請提出更具體的問題。 – Oliver

+0

@ Bgl86我知道如何閱讀文本文件,但我不知道如何將它們放入數據表中,加入它們並顯示在datagridview中。謝謝:) –

回答

1

這些都是我假設你已經有類,或將創建

public class Data1 
{ 
    public string Campionato { get; set; } 
    public string Data { get; set; } 
    public string Home { get; set; } 
    public string Away { get; set; } 
    public int HSFT { get; set; } 
    public int ASFT { get; set; } 
    public int HSHT { get; set; } 
    public int HSHT2 { get; set; } 
} 

public class Data2 //you can use inheritance and reduce duplication of properties 
{ 
    public string Data { get; set; } 
    public string Home { get; set; } 
    public string Away { get; set; } 
    public double HODD { get; set; } 
    public double AODD { get; set; } 
    public double XODD { get; set; } //no name in sample 
} 

public class CombinedData //you can use inheritance here too 
{ 
    public string Campionato { get; set; } 
    public string Data { get; set; } 
    public string Home { get; set; } 
    public string Away { get; set; } 
    public int HSFT { get; set; } 
    public int ASFT { get; set; } 
    public int HSHT { get; set; } 
    public int HSHT2 { get; set; } 
    public double HODD { get; set; } 
    public double AODD { get; set; } 
    public double XODD { get; set; } //some name 
} 

可以讀取原始數據,這樣

var data1 = File.ReadAllLines(@"C:\YourFolder\Data1.txt").ToList(); 
data1.RemoveAt(0); //reamoving the header 
var data2 = File.ReadAllLines(@"C:\YourFolder\Data2.txt").ToList(); 
data2.RemoveAt(0); //reamoving the header 

現在它們映射到正確的(類型)數據列表

var dataList1 = new List<Data1>(); 
foreach(var data in data1) 
{ 
    var columns = data.Split(';'); //add data validations 
    dataList1.Add(new Data1 
    { 
     Campionato = columns[0], 
     Data = columns[1], 
     Home = columns[2], 
     //other string properties 
     HSFT = int.Parse(columns[4]) 
     //other int properties 
    }); 
} 

var dataList2 = new List<Data2>(); 
foreach (var data in data2) 
{ 
    var columns = data.Split(';'); //add data validations 
    dataList2.Add(new Data2 
    { 
     Data = columns[0], 
     Home = columns[1], 
     //other string properties 
     HODD = double.Parse(columns[3]) 
     //other double properties 
    }); 
} 

現在你可以加入他們的行列,並在您的網格綁定。

注意:這是加入數據列,這將導致總共5行。

var combinedDataList = from d1 in dataList1 //Joining on Data here, use the key you have 
         join d2 in dataList2 on d1.Data equals d2.Data 
         select new CombinedData { Campionato = d1.Campionato, 
                Data = d1.Data, 
                HSFT = d1.HSFT, 
                HODD = d2.HODD }; //map all properties 

yourDataGrid.DataSource = combinedDataList; //check syntax here, not tested 
yourDataGrid.Bind(); 

更新

如果您想加入上多列(如數據&首頁),使用此語法

var combinedDataList = from d1 in dataList1 //Joining on Data & Home, yields 3 rows 
         join d2 in dataList2 on new { d1.Data, d1.Home } equals new { d2.Data, d2.Home } 
         select new CombinedData 
         { 
          Campionato = d1.Campionato, 
          Data = d1.Data, 
          HSFT = d1.HSFT, 
          HODD = d2.HODD //map rest of the properties 
         }; 
+0

感謝您的代碼,但我是一個新手,所以我會問你一些愚蠢的問題:) –

+0

@marcellogabrielli假設你只是一個新手,我讓代碼比compact更簡單。並添加了解釋,但隨時提問。 –

+0

我的愚蠢問題:) 1)我必須在「名稱空間」或「公共部分類」之後放置類? 2)我必須將其他代碼放入按鈕中? 3)我在這裏得到一個錯誤:yourDataGrid.Bind();請問你能幫幫我嗎? :) 謝謝! –

0

下面是數據類:

public class MyData 
{ 
    public String Campionato { get; set; } 
    public DateTime Data { get; set; } 
    public String Home { get; set; } 
    public String Away { get; set; } 
    public int Hsft { get; set; } 
    public int Asft { get; set; } 
    public int Hsht { get; set; } 
    public int Hsht_2 { get; set; } 
    public float Hodd { get; set; } 
    public float Aodd { get; set; } 
    public float Unknown { get; set; } 
} 

而這裏的代碼來讀取文件並加入數據:

var file1Data = File.ReadLines(@"File1.csv") 
        .Skip(1) // Skip header 
        .Select(line => line.Split(';')) 
        .Select(elements => new MyData 
        { 
         Campionato = elements[0], 
         Data = DateTime.ParseExact(elements[1], "MM'.'dd'.'yyyy", CultureInfo.InvariantCulture), 
         Home = elements[2], 
         Away = elements[3], 
         Hsft = Int32.Parse(elements[4]), 
         Asft = Int32.Parse(elements[5]), 
         Hsht = Int32.Parse(elements[6]), 
         Hsht_2 = Int32.Parse(elements[7]) 
        }); 

var file2Data = File.ReadLines(@"File2.csv") 
        .Skip(1) // Skip header 
        .Select(line => line.Split(';')) 
        .Select(elements => new MyData 
        { 
         Data = DateTime.ParseExact(elements[0], "MM'.'dd'.'yyyy", CultureInfo.InvariantCulture), 
         Home = elements[1], 
         Away = elements[2], 
         Hodd = float.Parse(elements[3]), 
         Aodd = float.Parse(elements[4]) 
        }); 

var joinedData = file1Data.Join(
         file2Data, 
         // Key generation should be optimized. Maybe take a look at http://stackoverflow.com/q/263400/1838048 
         myData => myData.Data.GetHashCode() + myData.Home.GetHashCode() + myData.Away.GetHashCode(), 
         myData => myData.Data.GetHashCode() + myData.Home.GetHashCode() + myData.Away.GetHashCode(), 
         (file1, file2) => new MyData 
         { 
          Campionato = file1.Campionato, 
          Data = file1.Data, 
          Home = file1.Home, 
          Away = file1.Away, 
          Hsft = file1.Hsft, 
          Asft = file1.Asft, 
          Hsht = file1.Hsht, 
          Hsht_2 = file1.Hsht_2, 
          Hodd = file2.Hodd, 
          Aodd = file2.Aodd, 
          Unknown = file2.Unknown 
         }); 


myDataGridView.DataSource = joinedData.ToList(); 

有很多硬編碼的東西,沒有一種錯誤檢查在那裏。所以對自己有很大的改進,但它應該給你一個很好的起點。