如何:联接不同文件的内容 (LINQ)

此示例演示如何联接两个逗号分隔文件中的数据,这两个文件共享一个用作匹配键的共同值。 如果您必须将两个电子表格的数据或一个电子表格和一个其他格式的文件的数据组合为一个新文件,则此技术很有用。 还可以修改此示例以适合任意种类的结构化文本。

创建数据文件

  1. 将下面这些行复制到名为 scores.csv 的文件中,并将此文件保存到您的项目文件所在的文件夹中。 例如,如果项目文件位于 Visual Studio 2010\Projects 中,则可以将 scores.csv 保存到该文件夹中。 此文件表示电子表格数据。 第 1 列是学生的 ID,第 2 至 5 列是测验分数。

    111, 97, 92, 81, 60
    112, 75, 84, 91, 39
    113, 88, 94, 65, 91
    114, 97, 89, 85, 82
    115, 35, 72, 91, 70
    116, 99, 86, 90, 94
    117, 93, 92, 80, 87
    118, 92, 90, 83, 78
    119, 68, 79, 88, 92
    120, 99, 82, 81, 79
    121, 96, 85, 91, 60
    122, 94, 92, 91, 91
    
  2. 将下面这些行复制到名为 names.csv 的文件中,并将此文件保存到您的项目文件所在的文件夹中。 例如,如果项目文件位于 Visual Studio 2010\Projects 中,则可以将 names.csv 保存到该文件夹中。 此文件表示一个电子表格,该电子表格包含学生的姓氏、名字和学生 ID。

    Omelchenko,Svetlana,111
    O'Donnell,Claire,112
    Mortensen,Sven,113
    Garcia,Cesar,114
    Garcia,Debra,115
    Fakhouri,Fadi,116
    Feng,Hanying,117
    Garcia,Hugo,118
    Tucker,Lance,119
    Adams,Terry,120
    Zabokritski,Eugene,121
    Tucker,Michael,122
    

示例

Class JoinStrings

    Shared Sub Main()

        ' Join content from spreadsheet files that contain 
        ' related information. names.csv contains the student name 
        ' plus an ID number. scores.csv contains the ID and a  
        ' set of four test scores. The following query joins 
        ' the scores to the student names by using ID as a 
        ' matching key. 

        Dim names As String() = System.IO.File.ReadAllLines("../../../names.csv")
        Dim scores As String() = System.IO.File.ReadAllLines("../../../scores.csv")

        ' Name:    Last[0],       First[1],  ID[2],     Grade Level[3] 
        '          Omelchenko,    Svetlana,  111,       2 
        ' Score:   StudentID[0],  Exam1[1]   Exam2[2],  Exam3[3],  Exam4[4] 
        '          111,           97,        92,        81,        60 

        ' This query joins two dissimilar spreadsheets based on common ID value. 
        ' Multiple from clauses are used instead of a join clause 
        ' in order to store results of id.Split. 
        Dim scoreQuery1 = From name In names 
                         Let n = name.Split(New Char() {","}) 
                            From id In scores 
                            Let n2 = id.Split(New Char() {","}) 
                            Where n(2) = n2(0) 
                            Select n(0) & "," & n(1) & "," & n2(0) & "," & n2(1) & "," &
                              n2(2) & "," & n2(3)

        ' Pass a query variable to a Sub and execute it there. 
        ' The query itself is unchanged.
        OutputQueryResults(scoreQuery1, "Merge two spreadsheets:")

        ' Keep console window open in debug mode.
        Console.WriteLine("Press any key to exit.")
        Console.ReadKey()
    End Sub 

    Shared Sub OutputQueryResults(ByVal query As IEnumerable(Of String), ByVal message As String)

        Console.WriteLine(System.Environment.NewLine & message)
        For Each item As String In query
            Console.WriteLine(item)
        Next
        Console.WriteLine(query.Count & " total names in list")

    End Sub 
End Class 
' Output: 
'Merge two spreadsheets: 
'Adams,Terry,120, 99, 82, 81 
'Fakhouri,Fadi,116, 99, 86, 90 
'Feng,Hanying,117, 93, 92, 80 
'Garcia,Cesar,114, 97, 89, 85 
'Garcia,Debra,115, 35, 72, 91 
'Garcia,Hugo,118, 92, 90, 83 
'Mortensen,Sven,113, 88, 94, 65 
'O'Donnell,Claire,112, 75, 84, 91 
'Omelchenko,Svetlana,111, 97, 92, 81 
'Tucker,Lance,119, 68, 79, 88 
'Tucker,Michael,122, 94, 92, 91 
'Zabokritski,Eugene,121, 96, 85, 91 
'12 total names in list
class JoinStrings
{
    static void Main()
    {
        // Join content from dissimilar files that contain 
        // related information. File names.csv contains the student 
        // name plus an ID number. File scores.csv contains the ID  
        // and a set of four test scores. The following query joins 
        // the scores to the student names by using ID as a 
        // matching key. 

        string[] names = System.IO.File.ReadAllLines(@"../../../names.csv");
        string[] scores = System.IO.File.ReadAllLines(@"../../../scores.csv");


        // Name:    Last[0],       First[1],  ID[2] 
        //          Omelchenko,    Svetlana,  11 
        // Score:   StudentID[0],  Exam1[1]   Exam2[2],  Exam3[3],  Exam4[4] 
        //          111,           97,        92,        81,        60 

        // This query joins two dissimilar spreadsheets based on common ID value. 
        // Multiple from clauses are used instead of a join clause 
        // in order to store results of id.Split.
        IEnumerable<string> scoreQuery1 =
            from name in names
            let nameFields = name.Split(',')
            from id in scores
            let scoreFields = id.Split(',')
            where nameFields[2] == scoreFields[0]
            select nameFields[0] + "," + scoreFields[1] + "," + scoreFields[2] 
                   + "," + scoreFields[3] + "," + scoreFields[4];

        // Pass a query variable to a method and execute it 
        // in the method. The query itself is unchanged.
        OutputQueryResults(scoreQuery1, "Merge two spreadsheets:");

        // Keep console window open in debug mode.
        Console.WriteLine("Press any key to exit");
        Console.ReadKey();
    }

    static void OutputQueryResults(IEnumerable<string> query, string message)
    {
        Console.WriteLine(System.Environment.NewLine + message);
        foreach (string item in query)
        {
            Console.WriteLine(item);
        }
        Console.WriteLine("{0} total names in list", query.Count());
    }
}
/* Output:
Merge two spreadsheets:
Adams, 99, 82, 81, 79
Fakhouri, 99, 86, 90, 94
Feng, 93, 92, 80, 87
Garcia, 97, 89, 85, 82
Garcia, 35, 72, 91, 70
Garcia, 92, 90, 83, 78
Mortensen, 88, 94, 65, 91
O'Donnell, 75, 84, 91, 39
Omelchenko, 97, 92, 81, 60
Tucker, 68, 79, 88, 92
Tucker, 94, 92, 91, 91
Zabokritski, 96, 85, 91, 60
12 total names in list
 */

编译代码

  • 创建一个面向 .NET Framework 3.5 或更高版本的 Visual Studio 项目。 默认情况下,该项目具有对 System.Core.dll 的引用以及针对 System.Linq 命名空间的 using 指令 (C#) 或 Imports 语句 (Visual Basic)。 在 C# 项目中,添加 System.IO 命名空间的 using 指令。

  • 将此代码复制到您的项目。

  • 按 F5 编译并运行程序。

  • 按任意键退出控制台窗口。

请参见

概念

LINQ 和字符串

LINQ 和文件目录