Вывод пустого значения, если в файле сделан пробел

 
 
 
Сообщения:4
Доброго времени суток, уважаемые программисты!


Столкнулся с проблемой из-за которой не сплю вторые сутки.

Цель: имеется файл (скриншот ниже) формата csv , в котором находятся 4 колонки. Программа вычисляет сколько раз встречается каждое слово из колонки "А" и высчитывает сумму чисел по каждому слову( которые из колонки "А") из колонки"D". Результат получается таким при хорошем раскладе:
Word "Bob". Count: 2, Sum: 6
Word "Garry". Count: 2, Sum: 8
. Все хорошо, проблем нет.



Проблема: НО стоит мне поставить пробел между буквами в любой строчке из колонки "B", то выдается пустое значение (т.е ошибки нет, но нет и результата) В качестве доказательства ниже скриншот.

Скриншот проблемы:


Ссылка на файл: https://yadi.sk/d/AT-xC64a3PR5P7

Скриншот из файла:

ВОПРОС: как решить эту проблему, чтобы при наличии пробела программа выдавала результат (естественно корректный )?


Собственно код:

public class WordInfo {

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



import java.io.File;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class testCSV {

    public static void main(String[] args) {


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


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

        try {
            Scanner inputStream = new Scanner(file);

            String[] values;
            String wordName;
            inputStream.useDelimiter(System.lineSeparator());
            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);
        }
    }
}

" а может да, а может нет?"
Изменен:05 ноя 2017 13:01
 
 
Сообщения:652
У меня работает с приведенным кодом, что с пробелом, что без. 2 помарки только, но это не существенно - без них не работало совсем.

Я только учусь
 
 
Сообщения:4
Tachkin:
У меня работает с приведенным кодом, что с пробелом, что без. 2 помарки только, но это не существенно - без них не работало совсем.


Не понял, какие помарки? Можно подробнее?

" а может да, а может нет?"
 
 
Сообщения:652
kaizersx:
какие помарки?

На скрине, кстати, нормально написано.

Сплит ты в коде бьешь по каждому символу и из массива пытаешься не 4, а 3 элемент взять.

Я бы еще проверку на длину массива прикрутил, что бы по ошибке массива не валиться, если что.

Я только учусь
 
 
Сообщения:4
Tachkin:
kaizersx:
какие помарки?

На скрине, кстати, нормально написано.

Сплит ты в коде бьешь по каждому символу и из массива пытаешься не 4, а 3 элемент взять.

Я бы еще проверку на длину массива прикрутил, что бы по ошибке массива не валиться, если что.


Доброго времени суток!

А если не сложно можешь отредактировать код , чтобы у меня тоже заработало?

" а может да, а может нет?"
 
 
Сообщения:19
1. файл по ссылке, строго говоря, не csv(comma-separated values), где разделителем является запятая, а dsv(delimiter-separated values), где разделитель произвольный, в данном случае символ точки с запятой. Т.е. надо добавить что-то типа
private static final String DELIMETER = ";";

и использовать эту константу при вызове метода split
values = inputStream.next().split(DELIMETER);

2. если уж использовать java.util.Scanner, то прочитать текстовый файл можно проще
      
while (scanner.hasNextLine()){
    String line = scanner.nextLine();
}      

а методы useDelimiter, hasNext и next предназначены немного для другого

3. колонки в файле 4, индекс для колонки суммы - 3, т.е. должно быть
wordSum = Integer.parseInt(values[3]);

Усложнять легко, упрощать - сложно
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет