从CSV Java中为列值选择行

时间:2019-06-18 15:47:55

标签: java csv row apache-commons-csv

我有一个基于“ url”列的值排序的CSV文件。 我想为每个“ url”值选择前三行。 如果用于url值的行少于3(2或1),我还是要选择它们。

起始CSV如下:

 url;review;priority;length
 zonk-di-brigada-igor-torino;"Ora sono tornati i vecchi gestori.";0;15
 zonk-di-brigada-igor-torino;"Buona qualità dei prodotti.";0;13
 zonk-di-brigada-igor-torino;"Ultimamente però l'apericena è scaduto.";0;13
 zonk-di-brigada-igor-torino;"I coktail sono buoni.";0;11
 zonk-di-brigada-igor-torino;"Per non parlare dei cocktail.";0;10
 zonk-di-brigada-igor-torino;"Locale molto bello.";0;7
 zichella-torino;"Che pasticceria";1;19
 zichella-torino;"Bar pasticceria di classe.";1;18

我想获得:

 url;review
 zonk-di-brigada-igor-torino;"Ora sono tornati i vecchi gestori."
 zonk-di-brigada-igor-torino;"Buona qualità dei prodotti."
 zonk-di-brigada-igor-torino;"Ultimamente però l'apericena è scaduto."
 zichella-torino;"Che pasticceria"
 zichella-torino;"Bar pasticceria di classe."

我从这段代码开始,但是只选择了一行。

 ArrayList<String> urls = new ArrayList<String>();
 String url, text;
 for (CSVRecord csvRecord : csvParserMatrix) 
 {
   url = csvRecord.get("url");
   text = csvRecord.get("review");
   if(!urls.contains(url))
   {
        urls.add(url);
        bw.write(url+";"+'"'+text+'"'+"\n");
   }
 }

1 个答案:

答案 0 :(得分:0)

这里的问题是您没有强制使用最大大小3。您的代码只是检查URL是否在列表中一次。

从这里开始:Trying to find all occurrences of an object in Arraylist, in java我对方法进行了修改,以获取出现次数。

static int indexOfAll(String obj, List<String> list) {
    final List<Integer> indexList = new ArrayList<>();
    int count = 0;
    for (int i = 0; i < list.size(); i++) {
        if (obj.equals(list.get(i))) {
            ++count;
        }
    }
    return count;
}

如果您使用的是Java 8+,则可以使用以下流:

urls.stream().filter(string -> string.equals(url)).count();

现在在if条件下,您只需调用此方法即可检查列表中该URL的出现次数并强制设置为3。

但这仅在您要坚持使用ArrayList的情况下。

一种更有效的方法是使用地图。您可以创建如下地图:

Map<String, Integer> URLCount = new HashMap<>();

然后您可以像这样将网址放入此Map中:

if (URLCount.containsKey(url)) {
    int count = URLCount.get(url);
    URLCount.put(url, ++count);
} else {
    URLCount.put(url, 1);
}

或者,以一种更好的方式:

URLCount.put(url, (URLCount.getOrDefault(url, 0) + 1));

然后,要强制执行3个限制,您可以从地图中获取该值。

if (URLCount.containsKey(url)) {
    int count = URLCount.get(url);
    if (count == 3) {
        continue;
    }
}

希望这会有所帮助。祝你好运。