代码之家  ›  专栏  ›  技术社区  ›  csse

如何从csv文件中拆分元素

  •  -1
  • csse  · 技术社区  · 7 年前

    如果我有以下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 回复  |  直到 7 年前
        1
  •  0
  •   Tim Biegeleisen    7 年前

    如果您想忽略商店名称,那么一个简单的解析器将执行以下操作:

    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* 相反。

        2
  •  0
  •   user8321763    7 年前

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

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

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