在 C# 中比较和过滤来自文件的数据

Compare and filter data from files in C#

我有两个文件。首先包含约。 20 行。

202    0021.ccc1.2e3b    DYNAMIC     Gi1/0/31
202    0023.246b.dd96    DYNAMIC     Gi1/0/16
202    0023.246e.2e41    DYNAMIC     Gi2/0/16

另一个(我把IP都涂黑了,估计1000行):

Internet  172.ZZ.XX.01           1   0021.ccc1.2e3b  ARPA   VlanXXX
Internet  172.ZZ.XX.02           0   0023.246e.2e41 ARPA   VlanXXX
Internet  172.ZZ.XX.03           3   0023.246b.dd96  ARPA   VlanXXX

现在我需要合并我得到端口的那两个文件,MAC 和 IP:

172.ZZ.XX.03 0023.246b.dd96 Gi2/0/16
172.ZZ.XX.02 0023.246e.2e41 Gi1/0/16
172.ZZ.XX.01 0021.ccc1.2e3b Gi1/0/31

所以基本上我需要遍历第一个文件并在第二个文件中找到 MAC 的等价物。然后print/output这三个值。

我用字典和哈希表试过,但它很复杂,我有点卡住了。有没有简单的方法来完成这个任务?

另外一个复杂的事实是,在第一个文件中,一个 interface/port 可能出现不止一次,而在第二个文件中,相同的 MAC.[=14 可能出现不止一次。 =]

编辑:我的尝试请求

我把每一行都放在一个列表中(第一个文件是TargetSwitch,第二个是CoreSwitch),然后调用InitHashtable 将数据放入两个哈希表中。之后,我通过遍历哈希表以一种时髦的方式找到了匹配项。端口也可能不正确,因为它需要第一个对应 mac-地址

private void InitHashtable()
    {
        foreach (string line in ListEntryTargetSwitch)
        {
            htTargetSwitch.Add(line.Split(delim, StringSplitOptions.RemoveEmptyEntries)[1], line.Split(delim, StringSplitOptions.RemoveEmptyEntries)[3]);
        }

        foreach (string line in ListEntryCoreSwitch)
        {
            if (line.Split(delim, StringSplitOptions.RemoveEmptyEntries)[3] != "Incomplete")
            {
                htCoreSwitch.Add(line.Split(delim, StringSplitOptions.RemoveEmptyEntries)[1], line.Split(delim, StringSplitOptions.RemoveEmptyEntries)[3]);
            }

        }
    }

    private void FindMatches()
    {
        StreamWriter sw = new StreamWriter(_txtResult3, false);


        foreach (string mac in htCoreSwitch.Values)
        {
            if (htTargetSwitch[mac] != null)
            {
                sw.WriteLine(mac + " " + htTargetSwitch[mac] + " " + htCoreSwitch.Keys.OfType<string>().FirstOrDefault(s => htCoreSwitch[s] == mac));
            }

        }
        sw.Close();
    }

按照以下步骤操作:

定义一个class c1,它包含line1中单行的所有信息。 与 file2 中的一行相同,将导致 class c2

将 file1 中的所有行解析为 c1 的列表 将所有行形式 file2 解析为 c2

的 lst

使用来自 c1 个对象的 MAC 键编号构建字典。

现在遍历 c1 对象,使用 MAC 数字在字典中找到匹配的 c2 对象,并从 c1 中打印出所有必需的信息,然后匹配 c2

你应该有这样的东西

class r1
{
  public  String f1, f2, f3, f4;

    public r1(string line)
    {
        //TODO: Parse line to fields
    }
}

class r2
{
    public String f1, f2, f3, f4, f5, f6;

    public r2(string p)
    {
        // TODO: Complete member initialization
    }
}

class r3
{
    public String f1, f2, f3;

    public String ToString()
    {
        //TODO: Implement
        return String.Format("{0} {1} {2}", f1, f2 ,f3);
    }
}

class c1
{        
    public static void main()
    {
        String path1 = "file1.txt";
        Dictionary<String, r1> file1_parsed = new Dictionary<string, r1>();
        StreamReader sr = new StreamReader(path1);
        while (!sr.EndOfStream)
        {
            String line = sr.ReadLine();
            r1 record = new r1(line);
            file1_parsed.Add(record.f2, record);
        }
        sr.Close();
        String path2 = "file2.txt";
        String path3 = "file3.txt";
        sr = new StreamReader(path2);
        StreamWriter result_file = new StreamWriter(path3);
        while (!sr.EndOfStream)
        {
            r2 record = new r2(sr.ReadLine());
            result_file.WriteLine(new r3 {
                f1=record.f2,
                f2=record.f4,
                f3=file1_parsed[record.f4].f4
            });
        }
        sr.Close();
        result_file.Flush();
        result_file.Close();
    }
}