1

Задача в следующем: есть файл s.csv ( во вложении и скриншот ), нужно получить количество раз, где встречается слово VAG и сумму чисел из колонки 'С' по слову VAG. Вообщем все получилось, только я НЕ ПОНИМАЮ, как задать циклы , чтобы автоматом посчитать еще по слову AND и другими словами, если их будет не две а десятки. Прошу показать на моем коде куда вбить циклы. Я полагаю, что должен быть массив String[]str={Vag,And}, который через for each в метод data.contains() прогоняет, но дальше темный лес.

package NewPhoneProj;

import java.io.*; import java.util.Scanner;

public class CSV {

public static void main(String[] args) {

    String FileName = "c:\\TestJava\\s.csv";

    File file = new File(FileName);

    try {
        Scanner inputStream = new Scanner(file);

        int sum = 0;

        int sumOfnum = 0;

        while (inputStream.hasNext()) {
            String data = inputStream.next();

                if (data.contains("Vag"))
                   {
                String[] values = data.split(";");
                int numbers = Integer.parseInt(values[2]);
                sum += numbers;
                sumOfnum++;



            }
        }
        inputStream.close();
        System.out.println("Sum: "+sum);
        System.out.println("SumOfnum: "+sumOfnum);

    } catch (FileNotFoundException e) {
        e.printStackTrace();

    }

}

}

введите сюда описание изображения

  • Тебе надо использовать HashMap<String, Integer> где String - слово, Integer - подсчет количества.......... типа такого https://ru.stackoverflow.com/a/595549/191482 .... только со своей обработкой – Алексей Шиманский Nov 04 '17 at 10:50
  • Уважаемый Алексей, а 1) HashMap Вы советуете вставить прямо в качестве обработчика потока из файла или в качестве обработчика после того как данные будут загружены в какой-нибудь список? 2) Циклы и условия не нужны дополнительные? – Vaagn Akopyan Nov 04 '17 at 10:59
  • ничего не понял)) Объявляешь мапу (например с именем wordsMap) там же, где и File file/String FileName.... далее в цикле while у тебя идет разбиение по сепаратору и проверка String[] values = data.split(";"); if (wordsMap.containsKey(values[0])) { ТУТ_СЛОЖЕНИЕ_В_МАПЕ_С_ДАННЫМ_СЛОВОМ значения с values[2] } else { ТУТ_ДОБАВЛЕНИЕ_В_МАПУ_СЛОВА и первоначальное значение values[2] } – Алексей Шиманский Nov 04 '17 at 11:07
  • Я буду тебе не по детски благодарен, если ты скорректируешь мой код согласно твоей рекомендации. Хоть убейся не могу в голову представить. Можно на конкретно примере показать? – Vaagn Akopyan Nov 04 '17 at 11:20

2 Answers2

0

Вот код который возвращает по каждому уникальному значению первой колонки соответствующую сумму.

public static void main(String[] args) {

    String FileName = "//home//dd//q.csv";

    File file = new File(FileName);

    try {
        Scanner inputStream = new Scanner(file);

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

        while (inputStream.hasNext()) {
            String data = inputStream.next();
            String[] values = data.split(";");
            if (map.get(values[0])==null) {
                map.put(values[0], Integer.parseInt(values[2]));
            } else {
                map.put(values[0], Integer.parseInt(values[2]) + map.get(values[0]));
            }

        }
        inputStream.close();

        for (String key : map.keySet()) {
            System.out.println(key + " " + map.get(key));
        }

    } catch (FileNotFoundException e) {
        e.printStackTrace();

    }

}
dSH
  • 1,551
  • И тебе спасибо добрый человек. Буду анализировать и укреплять знания. – Vaagn Akopyan Nov 04 '17 at 12:31
0

Предлагаю дополнительный класс WordInfo с информацией о слове. А также Map<String, WordInfo>, в которой будет она содержаться. В итоге при пробегании в цикле смотрим, если в мапе есть слово - то прибавляем count и добавляем значение в sum, если еще нет - добавляем в мапу с инициализированными значениями.

class WordInfo {
    public int count = 1;
    public int sum;
    public WordInfo(int sum){
        this.sum = sum;
    }
}

main:

public static void main(String[] args) throws java.lang.Exception {
    String FileName = "c:\\TestJava\\s.csv";

    File file = new File(FileName);
    Map<String, WordInfo> wordInfoMap = new HashMap<>();

    try {
        Scanner inputStream = new Scanner(file);

        String[] values; String wordName; Integer wordSum;
        while (inputStream.hasNext()) {
            values = inputStream.next().split(";");
            wordName = values[0];
            wordSum = Integer.parseInt(values[2]);

            if (wordInfoMap.containsKey(wordName)) {
                wordInfoMap.get(wordName).count++;
                wordInfoMap.get(wordName).sum += wordSum;
            } else {
                wordInfoMap.put(wordName, new WordInfo(wordSum));
            }
        }

        inputStream.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();

    }

    // Итог:
    WordInfo wordInfo;
    for (Map.Entry<String, WordInfo> wordInfoEntry : wordInfoMap.entrySet()) {
        wordInfo = wordInfoEntry.getValue();
        System.out.println("Word \"" + wordInfoEntry.getKey() 
                            + "\". Count: "+ wordInfo.count 
                            + ",  Sum: " + wordInfo.sum);
    }
}
  • Ну что же, огромное спасибо всем безразличным, а особенная благодарность Алексею за терпение и трудолюбие! – Vaagn Akopyan Nov 04 '17 at 12:29
  • @VaagnAkopyan если ответ помог - можно жмакать стрелку вверх и ставить галку) – Алексей Шиманский Nov 04 '17 at 12:35
  • галку поставил, но вот рейтинг поднять не дает, типо не дорос до этого еще) – Vaagn Akopyan Nov 04 '17 at 12:49
  • Алексей, попробовал тоже самое с другим файлом не получилось. Вот файл , соответственно поменял в массиве значения wordName = values[10]; wordSum = Integer.parseInt(values[17]); Пишет ошибку: Фото файла https://cdn1.savepice.ru/uploads/2017/11/4/f2cc7cc78f326b452ac5f0af05493062-full.png Вот фото компилятора : https://cdn1.savepice.ru/uploads/2017/11/4/f29e2564c22e36c7229a68fa2cd30386-full.png – Vaagn Akopyan Nov 04 '17 at 13:19
  • Подскажи, пожалуйста, если не трудно – Vaagn Akopyan Nov 04 '17 at 13:34
  • @VaagnAkopyan на самом деле я бы мог тебе пока порекомендовать прочитать вот это Как и какими средствами находить ошибки в коде Java?, включить отладчик и посмотреть что у тебя находится в значениях....Это самый верный способ определять что у тебя не так в коде..... и еще хочу заметить, что т.к. в первой строке находятся заголовки столбцов, то первую итерацию минимум надо пропустить, иначе Integer.parseInt может не распарсить – Алексей Шиманский Nov 04 '17 at 14:03
  • Я выяснил, что проблема в сепараторе (в разделителях слов). Т.е, если в слове сделан пробел или определенные иероглифы , то возникает ошибка. Теперь вопрос как правильно построить сепаратор values = inputStream.next().split(";"); Видимо кроме точки с запятой требуется еще что-то (( – Vaagn Akopyan Nov 04 '17 at 14:36
  • Если быть точнее, то проблема в регулярном выражении. Мне нужно , чтобы фильтр игнорировал все, кроме точки с запятой ; – Vaagn Akopyan Nov 04 '17 at 15:14
  • @VaagnAkopyan лучше создай еще один вопрос конкретно с данной проблемой. Глядишь быстрее ответ кто-то напишет, чем я) – Алексей Шиманский Nov 04 '17 at 15:25