读取csv文件并比较每行数据的Java应用程序

时间:2017-03-06 20:14:33

标签: java csv

我对编程很新,并且刚刚设置了创建一个应用程序的任务,该应用程序将从用户输入读取.csv文件名,然后再运行一系列测试。最终,程序需要比较每一行(csv文件中的每一行代表一个路由器)并返回哪些路由器需要基于设置标准的补丁。 CSV文件的格式如下所示,标题为“主机名”,“IP地址”,“已修补?”,“黑客版本”和“注释”,不一定需要包括在内 -

A.example.COM,  1.1.1.1, NO,    11,   Faulty fans
b.example.com,  1.1.1.2, no,    13,   Behind other routers
C.EXAMPLE.COM,  1.1.1.3, no,    12.1    
d.example.com,  1.1.1.4, yes,   14  
c.example.com,  1.1.1.5, no,    12,   Case a bit loose
e.example.com,  1.1.1.6, no,    12.3    
f.example.com,  1.1.1.7, No,    12.2    
g.example.com,  1.1.1.6, no,    15

因此,程序需要返回与任何其他路由器不共享相同主机名和IP地址的任何路由器的名称,当前操作系统版本为12或更高版本,或者尚未修补。

到目前为止,我已尝试将每个单独的行读作Java对象并从那里进行比较但是我没有成功。非常感谢任何有关如何使该计划有效的建议,谢谢。

3 个答案:

答案 0 :(得分:1)

首先问问自己哪种数据结构最适合您的最终结果。

  1. 你需要一个不允许重复的结构 - id表示一个hashmap 对此会有好处。
  2. 你有3个标准来征服输出中的这一行
    • 没有修补 - 最简单的所有标准
    • 超过12的版本仍然没什么难的
    • 没有重复
  3. Id建议澄清他们的优先事项 - 因为一条线可以是" no"作为修补,超过9000,并有bazilion重复 - 你做什么呢? 但是让我们说你有独立的标准 - 即你检查,你招募两个hashMaps联合它们。一个用于重复,一个用于另外两个(更多机械标准)。 最终结果将是适合那些标准之一的东西。您可以构建逻辑以检查先前的哈希映射 - 如果它已在先前列表中设置 - 您可以跳过添加它们。但这将是使用更多CPU和更少内存的权衡。根据您输入的大小,您可以决定哪种方式更适合您。

    现在检查重复项 - 您可以使用hashmap(非常快)检查重复项,并为该记录添加计数器。完成输入后 - 那些计数器== 1的那个将是你要找的那个。

    顺便说一下 - 从文件或直接从测试代码设置自动加载。在开发过程中从控制台键入这些列表是一个令人厌倦和不受欢迎的过程。祝你好运。

答案 1 :(得分:1)

以下是我的建议:

  1. 创建一个包含“hostName”的类(我们称之为“Router”) - String,“ipAddresss” - String,“patched” - Boolean,“osVersion” - Double和“notes” - String。添加相关的设置器和getter。
  2. 创建一个包含“路由器”类列表的“路由器”列表,并将其初始化为空。
  3. 创建一个以Router对象作为参数的方法。首先比较“osVersion”。然后遍历“路由器”列表。在迭代期间,将给定的Router对象与您遇到的每个Router对象进行比较。如果有重复项,则不执行任何操作,否则在迭代后将此对象添加到列表中。
  4. 遍历CSV文件的每一行,并将每一行解析为“Router”对象,并调用您从#3创建的方法。
  5. “路由器”应包含程序完成后的最终结果。

答案 2 :(得分:1)

为您的csv格式工作解决方案。请参阅使用equals和hashCode查看包含方法的工作原理 您需要覆盖equals和hashcode方法以进行比较并使用contains()方法

以下是您在此处发布的csv解决方案。

package csv;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Shailesh Singh
 */
public class CSV {
    public static void main(String[] args) {
        List<Router> routers = new ArrayList<Router>();
        String fileToParse = "aaa.csv";
        BufferedReader fileReader = null;
        try
        {
            String line = "";
            fileReader = new BufferedReader(new FileReader(fileToParse));
            while ((line = fileReader.readLine()) != null) 
            { 
                String[] tokens = line.split("\\,", -1);
                //First level filter based on your requirement.
                if(Float.parseFloat(tokens[3])>=12 || tokens[2].toLowerCase().equals("no")){// this will check whether os version greater than 12 or pached no
                    routers.add(new Router(tokens[0], tokens[1], tokens[2], tokens[3], tokens[4]));
                }
            }
        } 
        catch (Exception e) {
            e.printStackTrace();
        } 
        finally
        {
            try {
                fileReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        List<Router> uniqueList = new ArrayList<Router>();
        System.out.println(routers);
        System.out.println("\n..........................................");
        for (Router router : routers) {
            //Loop through all the objects and store in a new unique array list
            //contains method works based on equals and hashcode
            if (!uniqueList.contains(router)) {
                uniqueList.add(router);
            }
        }
        System.out.println(uniqueList);
    }

}

现在 Router.java

package csv;

/**
 *
 * @author Shailesh Singh
 */
public class Router {
    private String hostName;
    private String ip;
    private String patched;
    private String osVersion;
    private String note;

    public Router(String hostName, String ip, String patched, String osVersion, String note) {
        this.hostName = hostName;
        this.ip = ip;
        this.patched = patched;
        this.osVersion = osVersion;
        this.note = note;
    }

    public String getHostName() {
        return hostName;
    }

    public void setHostName(String hostName) {
        this.hostName = hostName;
    }

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    //Getters and setters.....................
    //Define all

    @Override
    public String toString() {
        return "Router{" + "hostName=" + hostName + ", ip=" + ip + ", patched=" + patched + ", osVersion=" + osVersion + ", note=" + note + '}'+"\n";
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        }
        if (obj == null || obj.getClass() != this.getClass()) {
            return false;
        }

        Router r = (Router) obj;
        if((hostName == r.hostName || (hostName != null && hostName.equals(r.getHostName()))) && (ip == r.ip || (ip != null && ip .equals(r.getIp())))){
            return true;
        }
        else{
            return false;
        }
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result
                + ((hostName == null) ? 0 : hostName.hashCode());
        result = prime * result
                + ((ip == null) ? 0 : ip.hashCode());
        return result;
    }


}

请注意,equals()方法和hashCode()方法已在Router类中重写。

解决方案的重要部分是

............................
    List<Router> uniqueList = new ArrayList<Router>();
    System.out.println(routers);
    System.out.println("\n..........................................");
    for (Router router : routers) {
        //Loop through all the objects and store in a new unique array list
        //contains method works based on equals and hashcode
        if (!uniqueList.contains(router)) {//contains seeks equals and hashcode()
            uniqueList.add(router);
        }
    }
    System.out.println(uniqueList);
相关问题