java - 解析 csv 文件并在 java 集合 hashmap 中显示特定信息

原文 标签 java csv hashmap

我正在练习 java,这对我来说是新的,最近了解了 java 中的集合。我想解析一个 csv 文件并将其存储在 hashmap 上。另外,我不想使用任何解析器。

我的 CSV 文件:-

id,date,ministry,questions
2011,15.02.2014,HEALTH,What was the outcome
20757,24.02.2015,"DEFENCE , FINANCE" ,"Your budget this year .."
20113,17.03.2013,HEALTH, Hospitals build

所以,我有几个问题:-
  • 我想要"DEFENCE , FINANCE"在同一列。我将如何使用正则表达式删除“,”,以便分隔符不会设置新列
  • 我想显示每个部委提出的问题数量。例如:- HEALTH 总共有 2 个问题等。
  • 也没有重复。

  • 我正在通过 I/O 文件阅读器进行解析。

    我的代码:-
    public class MainData {
    
        public static void main(String[] args) throws IOException ,FileNotFoundException{
    
            String line = "";
            String cvsSplitBy = ",";
    
        try{
            BufferedReader br = new BufferedReader(new FileReader("src/main/resources/rj.csv"));
            HashMap<String,String> rjFile = new HashMap<String, String>();
            System.out.println("running"+rjFile);
    
    
            while ((line = br.readLine()) != null) {
    
                String[] rj = line.split(cvsSplitBy);
    
                System.out.println(br);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        }
    }
    

    PS:-我只想使用与 map 相关的 Collection 。

    最佳答案

    这是一个简单的示例,可以帮助您入门。我已经提出了两种方法(问题列表和问题计数)。选择一个适合您的需要并删除另一个或同时使用:

    import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class MainData {
        public static void main(String[] args) throws IOException, FileNotFoundException {
            String line = "";
            String cvsSplitBy = ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)";
    
            try {
                BufferedReader br = new BufferedReader(new FileReader("src/main/resources/rj.csv"));
                Map<String, List<String>> questListByMinistry = new HashMap<>();
                Map<String, Integer> questCountByMinistry = new HashMap<>();
                //skip the first line (header)
                br.readLine();
                while ((line = br.readLine()) != null) {
                    String[] rj = line.split(cvsSplitBy);
    
                    if(!questCountByMinistry.containsKey(rj[2])){
                        //if the ministry doesn't exist as key yet put it to your map and put the value 1
                        questCountByMinistry.put(rj[2], 1);
                    }
                    else{
                        //else if it already exist get the current value and add +1
                        questCountByMinistry.put( rj[2], questCountByMinistry.get(rj[2])+1);
                    }
    
                    //-----------------------------------------------
    
                    if(!questListByMinistry.containsKey(rj[2])){
                        //if key doesen't exist put it to map and create a new list                    
                        questListByMinistry.put(rj[2], new ArrayList<>());
                        // and add the question to the list
                        questListByMinistry.get(rj[2]).add(rj[3]);
                    }
                    else{
                        //else if key already exists get the list associated to key and add the question
                        questListByMinistry.get(rj[2]).add(rj[3]);
                    }                
                }
                System.out.println(questCountByMinistry);
                System.out.println(questListByMinistry);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    如果您正在使用Java8或以上/如果您想熟悉Java8的 future

    上面的代码可以重写为:
    public static void main(String[] args) throws IOException, FileNotFoundException {
        String line = "";
        String cvsSplitBy = ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)";
    
        try {
            BufferedReader br = new BufferedReader(new FileReader("src/main/resources/rj.csv"));
            Map<String, List<String>> questListByMinistry = new HashMap<>();
            Map<String, Integer> questCountByMinistry = new HashMap<>();
            //skip the first line 
            br.readLine();
            while ((line = br.readLine()) != null) {
                String[] rj = line.split(cvsSplitBy);
                questListByMinistry.computeIfAbsent(rj[2], k -> new ArrayList<>()).add(rj[3]);
                questCountByMinistry.compute(rj[2], (k,v) -> v==null? 1 : v+1);                    
            }
            System.out.println(questCountByMinistry);
            System.out.println(questListByMinistry);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    关于java - 解析 csv 文件并在 java 集合 hashmap 中显示特定信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58539298/

    相关文章:

    ruby-on-rails - Ruby/Rails CSV 解析,UTF-8 中的无效字节序列

    ruby - 你如何使用 Ruby CSV 转换器?

    java - 如何显示ArrayList中包含重复值的所有项目?

    java - 普通的Json字符串到HashMap

    java - 使用RestTemplate的POST InputStream

    java - 将多个项目导入eclipse

    java - 在循环时为链接列表创建名称(Java)

    java - 在 maven clean install 期间查找不同版本的组件(来自 pom 中定义的)

    python - 有没有办法并行化 Pandas 的 Append 方法?

    java - 无法注册类(class)