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

时间:2015-02-03 14:27:05

标签: c# network-programming

我有两个文件。首先包含ca. 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的等效文件。然后打印/输出这三个值。

我用Dictionaries和Hashtables试了一下,但它很复杂,而且我有点卡住了。有没有简单的方法来完成这项任务?

另外一个复杂的事实是,在第一个文件中,一个接口/端口可能会出现多次,而在第二个文件中,同一个MAC可能不止一次。

编辑:我的尝试请求

我将每行放入List(第一个文件是TargetSwitch,第二个CoreSwitch),然后调用InitHashtable将数据放入两个哈希表中。之后,我通过迭代哈希表以一种时髦的方式找到匹配。 Ports meight也不正确,因为它需要第一个mac-Adress的通讯员

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();
    }

2 个答案:

答案 0 :(得分:1)

你应该得到这样的东西

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();
    }
}

答案 1 :(得分:0)

请按照以下步骤操作:

定义一个类c1,其中包含line1中单行的所有信息。 对于file2中的一行,它将导致类c2

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

的lst

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

现在循环浏览c1个对象,使用MAC编号在字典中找到匹配的c2对象,并打印出来自c1并匹配c2的所有必需信息