2015-09-14 75 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(); 

有很多硬编码的东西,没有一种错误检查在那里。所以对自己有很大的改进,但它应该给你一个很好的起点。