Java - 根据列将CSV解析为Hashmap和Arraylist

时间:2015-11-16 20:49:16

标签: java parsing csv arraylist hashmap

我想请求帮助完成这项任务:例如我有CSV:

column1$column2$column3
123$xyz$321
456$zyx$654

我想用Java解析它,所以我会为每一列都有一个数据列表的Hashmap。 例如:

["column1",[123,456]]
["column2",[xyz,zyx]]
["column3",[321,654]]

谢谢大家。

有人已经给我建议如何通过数组列表的数组列表来解决这个任务,但是我想使用Hashmap,所以我可以得到列的索引。我怎么编辑这段代码?

public static void main(String[] args) {
    ArrayList<ArrayList<String>> columns = new ArrayList<ArrayList<String>>();
    BufferedReader br = null;
    try {
        String sCurrentLine;
        br = new BufferedReader(new FileReader("testing.cvs"));

        while ((sCurrentLine = br.readLine()) != null) {
            String[] fields = sCurrentLine.split("\\$");
            for (int i = 0; i < fields.length; i++) {
                if (columns.size()<=i){
                    columns.add(new ArrayList<String>());
                }
                columns.get(i).add(fields[i]);
            }
        }

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (br != null)br.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

谢谢大家

4 个答案:

答案 0 :(得分:0)

让我在你的时候传递一些代码......

在此解决方案中,我为Maps - column name使用了两个values,为index - column name

使用了一个Map<String, List<String>> mappedCols = new HashMap<String, List<String>>(); Map<Integer, String> indexCols = new HashMap<Integer, String>(); BufferedReader br = null; try { String sCurrentLine; br = new BufferedReader(new FileReader("testing.cvs")); boolean firstLine = true; while ((sCurrentLine = br.readLine()) != null) { String[] fields = sCurrentLine.split("\\$"); for (int i = 0; i < fields.length; i++) { if (firstLine) { indexCols.put(i, fields[i]); mappedCols.put(fields[i], new ArrayList<String>()); } else { String colName = indexCols.get(i); if (colName == null) { break; } mappedCols.get(colName).add(fields[i]); } } firstLine = false; } } catch (IOException e) { e.printStackTrace(); } finally { try { if (br != null) br.close(); } catch (IOException ex) { ex.printStackTrace(); } }

在第一行,我填充索引地图,然后我开始填充它们......

mappedCols

您所追求的结果位于wget -q -O- http://ipecho.net/plain

答案 1 :(得分:0)

未经测试 - 但应该非常接近 -

 public static void main(String[] args) {
        Map<String, List<String>> columnsMap = new HashMap<>();
        BufferedReader br = null;
        try {
            String sCurrentLine;
            br = new BufferedReader(new FileReader("testing.cvs"));

            while ((sCurrentLine = br.readLine()) != null) {
                String[] fields = sCurrentLine.split("\\$");

                for (int i = 0; i < fields.length; i++) {
                    String columnKey = "column" + (i + 1);
                    List<String> columnValuesList = columnsMap.get(columnKey);
                    if (columnValuesList == null) {
                        columnValuesList = new ArrayList<>();
                    }

                    columnValuesList.add(fields[i]);
                    columnsMap.put(columnKey, columnValuesList);
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (br != null)
                    br.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }

答案 2 :(得分:0)

以下解决方案使用列HashMap&gt;它将String作为键(列名),将ArrayList作为值。我已经用n个列和行测试了它并且工作得很好。

                markers.push({
                    latitude: site.latitude,
                    longitude: site.longitude,
                    id: 1,
                    icon: {
                        url: 'path/to/icon',
                        origin: origin,
                        anchor: anchor
                    },
                    options: {
                        shape: {
                            coords: phaseMarker.coords,
                            type: "poly"
                        }
                    }
                });

答案 3 :(得分:0)

使用univocity-parsers&#39; ColumnProcessor可靠地为您做到这一点:

CsvParserSettings parserSettings = new CsvParserSettings();
parserSettings.getFormat().setLineSeparator("\n");
parserSettings.getFormat().setDelimiter('$');
parserSettings.setHeaderExtractionEnabled(true);

// To get the values of all columns, use a column processor
ColumnProcessor rowProcessor = new ColumnProcessor();
parserSettings.setRowProcessor(rowProcessor);

CsvParser parser = new CsvParser(parserSettings);

//This will kick in our column processor
parser.parse(new FileReader("testing.cvs"));

//Finally, we can get the column values:
Map<String, List<String>> columnValues = rowProcessor.getColumnValuesAsMapOfNames();

比手工操作更干净,更快捷,更轻松。这将处理诸如具有不同列数的行之类的情况,并将null添加到列表中,而不是向您抛出异常。

披露:我是这个图书馆的作者。它是开源和免费的(Apache V2.0许可证)。