【问题标题】:convert a csv file of header and lines to an array of hashmap using java streams使用java流将标题和行的csv文件转换为hashmap数组
【发布时间】:2018-10-24 15:17:44
【问题描述】:

如何使用 java 流将标题和行的 csv 文件转换为 hashmap 数组? 例如。

orderNo, totals, charges, taxes, payments
ord121,1500.00,30.00,25.00,Paid
ord8925,1700.00,130.00,75.00,Paid
ord7115,300.00,130.00,75.00,Paid

Hashmap 的数组[0] 的名称应为 orderNo,值应为 ord121
Hashmap 的 Array[1] 的 Name 为 orderNo , value 为 ord8925... 以此类推

试过了,但坚持如何将 row(0) 内容作为 hashmap 名称

公共静态无效 readFileToMap() {

    Pattern pattern = Pattern.compile(",");
    String csvFile = inputDirPreFix + "input/file2.tsv";
    try (BufferedReader in = new BufferedReader(new FileReader(csvFile));){

        Map<String,String> namefreq = in
                .lines()
                .skip(1)
                .map(lineData -> pattern.split(lineData))
                .collect(HashMap::new, (map, lineData) ->
                                map.put(lineData[0], lineData[1]),
                        Map::putAll);
        namefreq.forEach((k, v) -> System.out.println(k + " => " + v));
    }
    catch (Exception ex) {
        Logger.getLogger("FileProcessing").log(Level.SEVERE, null, ex);
    }
}

【问题讨论】:

  • 到目前为止你尝试过什么?你如何读取 csv 并在内存中表示它?您要流式传输的输入结构是什么?
  • 有什么理由必须是流?
  • 有什么理由必须是流? – Joe C .. 不是真的,如果没有它更容易更快 - 我也很喜欢这个选项

标签: java csv java-8 stream java-stream


【解决方案1】:

我认为您应该将每一行转换为Map&lt;String, String&gt;,然后将所有地图收集到List&lt;Map&lt;String, String&gt;&gt;

try (BufferedReader in = new BufferedReader(new FileReader(csvFile))) {

    List<Map<String,String>> namefreq = in.lines()
        .skip(1)
        .map(line -> pattern.split(line)) // or pattern::split
        .map(line -> {
            Map<String, String> map = new HashMap<>();
            map.put("NAME_OF_FIRST_COLUMN", line[0]);
            map.put("NAME_OF_SECOND_COLUMN", line[1]);
            // ... (etc)
            return map;
         })
        .collect(Collectors.toList());
}

编辑:与其收集地图列表,不如创建自己的类,即Order,具有orderNototals等属性,以及getter和setter以及一个构造函数接收整行,或者可能是每个属性。然后,您可以收集到List&lt;Order&gt;

【讨论】:

  • 抱歉 Federico,也许我没有更好地阐明需求.. 地图中的名称不应硬编码,而是从文件的标题行读取..
【解决方案2】:

暂时没有流管理...

public static void readFileToMap() {

    String csvFile = inputDirPreFix + "input/file2.tsv";
    String []  strArrHeaderFields =new String [20]  ;
    HashMap objDataHashMap ;
    HashMap <Integer,Object> objAggregateData = new HashMap(); ;

    String [] strArrValues = new String[20];

    try {
        List<String> fileLinesList = Files.readAllLines(Paths.get(csvFile));

        strArrHeaderFields =fileLinesList.get(0).split(",");
        //System.out.println( Arrays.toString(objHeaderFields)  );

        //skip header line and collect data lines in hashmap with Name as Header line values..
        // for every data line,
        for( int i=1; i< fileLinesList.size(); i ++) {
            objDataHashMap = new HashMap();
            //get values from each data line
            strArrValues =fileLinesList.get(i).split(",");

            for( int j=0; j< strArrHeaderFields.length; j++) {
                 objDataHashMap.put(strArrHeaderFields[j], strArrValues[j]);
            }

            //System.out.println( "objDataHashMap Count of Records ...." + objDataHashMap.size() );
            objAggregateData.put(i,objDataHashMap);

        }
        System.out.println( "objAggregateData Count of Records ...." + objAggregateData.size() );

        objAggregateData.forEach((k,v) -> {
            System.out.println(k + " : " + v );
        });

    } catch (Exception ex) {
        Logger.getLogger("FileProcessing").log(Level.SEVERE, null, ex);
    }
}

【讨论】:

    猜你喜欢
    • 2019-12-06
    • 2020-06-08
    • 2014-02-20
    • 2016-01-30
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    相关资源
    最近更新 更多