【问题标题】:Remove duplicates from csv and count them in Java从 csv 中删除重复项并在 Java 中计算它们
【发布时间】:2016-04-10 19:40:49
【问题描述】:

我正在尝试从路由器创建的日志文件中提取文本行并将其分解为 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");
    }
}

有很多问题我无法用我的方法解决这个问题。其中之一是我不能说:“如果 IP 大于 192.168.1.0 且小于 192.168.1.254,则主机 = 家庭网络”,因为 IP 被写成字符串来举例。

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

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

这可以在 excel 中使用删除重复项功能轻松完成,并且计算 if 也可以在 excel 中完成,但这需要每次都编写公式,或者在最佳情况下,向下拖动公式。

【问题讨论】:

    标签: java excel csv ip ip-address


    【解决方案1】:

    您不应该尝试通过基于 IO 的 while 循环在一次运行中执行所有这些逻辑。忘记 CSV 文件以及您对 excel 的了解。他们让你感到困惑,而不是帮助你。

    分解问题。

    通读一遍日志。

    为每一行定义一个 POJO 类,并创建这些对象的 List,每行一个。

    POJO 是“普通的旧 Java 对象”。只是一堆数据字段,带有 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 * 第三个四边形 + 第四个四边形

    运行汇总逻辑以组合欺骗、获取计数等。

    一次只做一步。你会到达那里。

    【讨论】:

    • 感谢发帖!正如您可能会说的那样,我对 Java 真的很陌生。我得查一下你使用的一些术语,因为这是我第一次听说 POJO 类,但我很感谢你的时间。
    • POJO = "普通的旧 Java 对象"。我会更新答案。
    • Apache 的 SubnetUtils 在这方面会很棒
    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 2016-03-21
    • 2021-01-23
    • 2019-08-04
    相关资源
    最近更新 更多