如何从csv文件中分割元素

时间:2018-05-23 05:37:19

标签: java csv hashmap

如果我有以下CSV文件

enter image description here

如何在哈希映射列表中拆分项目名称和数量并忽略商店名称?

这是我到目前为止所做的:

public class ListRead {

    HashMap<String, Integer> csvList = new HashMap<>();

    public void loadManifest() throws IOException {

        FileReader ListCSV = new FileReader("list.csv");
        BufferedReader reader = new BufferedReader(ListCSV);

        while (true) {
            String line = reader.readLine();
            if (line == null) {
                break;

            String[] listElement = line.split(",");
            System.out.println(Arrays.toString(listElement));

            // add to csvList

        }


    }

}

我打印listElement时的输出:

[>Shop A]

[shirt, 325]

[jeans, 475]

[>Shop B]

[car, 2]

[phone, 120]

[charger, 250]

2 个答案:

答案 0 :(得分:0)

如果你想忽略商店名称,那么一个简单的解析器就可以:

Map<String, Integer> map = new HashMap<>();
String line;
String currentShop = null;

while ((line = reader.readLine()) != null) {
    if (!line.matches(">.*,")) {
        String[] listElement = line.split(",");
        map.put(listElement[0], Integer.parseInt(listElement[1]));
    }
}

这里的逻辑是,如果我们遇到由>后跟商店名称和逗号表示的商店行,那么我们就不会尝试将该行解析为地图。另外,我假设数据行的分隔符实际上只是逗号,没有空格。如果你期望有空格,那么你可以分开\s*,\s*之类的东西。

答案 1 :(得分:0)

您提到的代码正确解析了该行。您现在要做的就是将这些项插入到创建的hashmap中。

if(line.charAt(0)!='>')
{
    int quantity = Integer.parseInt(listElement[1].trim());
    String item = listElement[0].trim();
    csvList.put( item , quantity); 
}

此外,如果需要,您可能还想添加另一个地图来存储商店名称。上面的代码只是忽略了商店信息。