从 csv 中删除重复项并在 Java 中计数

Remove duplicates from csv and count them in Java

我正在尝试从我的路由器创建的日志文件中提取文本行并将其分解为一个 csv 文件以便于查看。

日志文件中的示例行:

[VPN-IPSEC rule not match] from 192.168.1.254:63991 to 8.8.8.8:53 Wednesday, January 06,2016 08:52:18

我希望最后的文件有一列规则,向内的IP地址,向内的端口,向外的IP地址,向外的端口,主机名,日期和连接数量(重复)。

public static void main(String[] args) throws UnknownHostException, IOException {

    PrintStream diskwriter = new PrintStream("C:\Users\admin\Desktop\RawIPs.csv");

    diskwriter.print("Rule" + ",");
    diskwriter.print("Host Name" + ",");
    diskwriter.print("IP Address" + ",");
    diskwriter.println("Port");

    int count = 0;

    try (BufferedReader br = new BufferedReader(new FileReader("C:\Users\admin\Desktop\IPs.txt"))) {
        String line;
        while ((line = br.readLine()) != null) {

    String IPaddress = line;

    String IPadd = IPaddress.substring((IPaddress.lastIndexOf("to") +3));
    String IP = IPadd.substring(0, IPadd.indexOf(":"));


    String Rule = IPaddress.substring((IPaddress.indexOf("[") +1), (IPaddress.indexOf("]")));

    String Port = IPadd.substring((IPadd.indexOf(":") +1), IPadd.indexOf(" "));

    String host;

    count++;

    if(IP.startsWith("212.56.7"))
    {
        host = "Plus Net";
    }
    else if(IP.equals("157.56.144.215") || IP.equals("40.113.152.30") || IP.equals("23.102.160.172") || IP.equals("157.56.106.184") || IP.equals("94.245.121.251") || IP.equals("157.56.75.164") || IP.equals("134.170.185.125") || IP.equals("191.237.208.126") || IP.equals("191.232.139.253") || IP.equals("157.55.231.252"))
    {
        host = "Microsoft";
    }
    else if(IP.startsWith("104.16.") || IP.equals("172.69.2.2"))
    {
        host = "CloudFlare";
    }
    else if(IP.startsWith("68.232."))
    {
        host = "EdgeCast Networks";
    }
    else if(IP.startsWith("192.225.15"))
    {
        host = "ThreatMetrix";
    }
    else if(IP.startsWith("70.32."))
    {
        host = "Gigenet";
    }
    else if(IP.startsWith("185.31.19"))
    {
        host = "Fastly London 1 Operations (Hosting Company)";
    }
    else if(IP.startsWith("96.31."))
    {
        host = "Host Collective";
    }
    else if(IP.startsWith("182.70."))
    {
        host = "Bharti Telenet (India - Vodafone)";
    }
    else if(IP.startsWith("17."))
    {
        host = "Apple Inc.";
    }
    else if(IP.startsWith("199.16.15"))
    {
        host = "Twitter Inc.";
    }
    else if(IP.startsWith("128.0."))
    {
        host = "RIPE Network Coordination Centre";
    }
    else if(IP.startsWith("129.1."))
    {
        host = "Bowling Green State University";
    }
    else if(IP.startsWith("185.42.205.144") || IP.startsWith("192.16.64.181"))
    {
        host = "Twitch.tv";
    }
    else if(IP.startsWith("122.248.142.74"))
    {
        host = "Netgear";
    }
    else if(IP.startsWith("173.241.2"))
    {
        host = "OpenX Technologies";
    }
    else if(IP.startsWith("69.172."))
    {
        host = "Peer 1 Network (USA)";
    }
    else if(IP.startsWith("204.154.110") || IP.startsWith("204.154.111"))
    {
        host = "DoubleVerify";
    }
    else if(IP.startsWith("208.146."))
    {
        host = "Internap Network Services";
    }
    else
    {
        InetAddress addr = InetAddress.getByName(IP);
        host = addr.getCanonicalHostName();
    }

    diskwriter.print(Rule + ",");
    diskwriter.print(host + ",");
    diskwriter.print(IP + ",");
    diskwriter.println(Port);

        }

        System.out.println("There were " + count + " connections");
    }
}

有很多问题我无法用我解决这个问题的方法来解决。其中之一是我不能说的事实:"If IP is greater than 192.168.1.0 and less than 192.168.1.254, host = home network" 因为 IP 被写成字符串来举个例子。

我希望今天能得到帮助的东西是重复的。我不仅想从我的 CSV 文件中删除重复项,而且我还想对它们进行计数。记录是否算作重复取决于所有字段是否相同,而不仅仅是单个记录。

我还希望将唯一值的数量保存在一个变量中,这样我就可以在循环结束后将其打印到控制台。

这可以在 excel 中使用删除重复项函数轻松完成,如果也可以在 excel 中进行计数,但这需要每次或在最佳情况下都编写公式, 向下拖动公式。

您不应该尝试通过 IO-based while 循环在单个 运行 中执行所有这些逻辑。忘掉 CSV 文件和你所知道的 excel。比起帮助你,他们更让你困惑。

分解问题。

通读一次日志。

定义一个对应于每一行的 POJO class 并创建一个包含这些对象的列表,每行一个。

POJO 是 "Plain Old Java Object"。只是一堆数据字段,带有 setter 和 getter。例如:

public class LogEntry {
   private String host;
   private String port; 
   private String rule;

   public String getHost() {
      return this.host;
   }

   public void setHost(String host) {
      this.host = host;
   }

   public String getPort() {
      return this.port;
   }

   public void setPort(String port) {
      this.port = port;
   }
   public String getRule() {
      return this.rule;
   }

   public void setRule(String rule) {
      this.rule = rule;
   }
}

将 IP 地址转换为数字。这很容易。 256^3 * 第一个四边形 + 256^2 * 第二个四边形 + 256 * 第三个四边形 + 第四个四边形

运行 合并欺骗、获取计数等的总结逻辑

一步一个脚印。你会到达那里。