Ошибка NumberFormatException при чтении файла CSV

219
03 декабря 2017, 13:03

Существует файл report.CSV.

Задача программы посчитать сколько раз встречается слово из колонки К и посчитать сумму чисел из колонки R по каждому слову из колонки К.

Вот программа:

public class CSVtestclass {
    public static void main(String[] args) throws IOException {    
        String FileName = "c:\\TestJava\\report.csv";    
        File file = new File(FileName);
        Map<String, WordInfo> wordInfoMap = new HashMap<>();    
        try(BufferedReader read = new BufferedReader(new FileReader(file))){
            String s;
            String wordName;
            HashMap<String, int[]> stringIntegerHashMap = new HashMap<>();
            read.readLine();
            while( (s = read.readLine()) != null) {
                String[] next = s.split(";");
                wordName = next[10];
                if (stringIntegerHashMap.containsKey(wordName)) {
                    int[] ints = stringIntegerHashMap.get(wordName);
                    ints[0]++;
                    ints[1] += Integer.parseInt(next[17]);
                } else {
                    stringIntegerHashMap.put(wordName, new int[]{1, Integer.parseInt(next[17])});
                }
            }
            for (Map.Entry<String, int[]> pair: stringIntegerHashMap.entrySet()) {
                int[] value = pair.getValue();
                System.out.printf("%s zayavki: %d interakcii: %d%n", pair.getKey(), value[0], value[1]);
            }

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

Во время выполнения программы выходит ошибка:

Exception in thread "main" java.lang.NumberFormatException: For input string: ""0""
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.base/java.lang.Integer.parseInt(Integer.java:638)
at java.base/java.lang.Integer.parseInt(Integer.java:770)
at CSVpack.CSVtestclass.main(CSVtestclass.java:31)

Где я ошибся?

Answer 1

public class CSVtestclass {

public static void main(String[] args) throws IOException {
    String FileName = "c:\\TestJava\\report.csv";
    File file = new File(FileName);
    Map<String, WordInfo> wordInfoMap = new HashMap<>();    
    try (BufferedReader read = new BufferedReader(new FileReader(file))) {
        String s;
        String wordName;
        HashMap<String, int[]> stringIntegerHashMap = new HashMap<>();
        read.readLine();
        while ((s = read.readLine()) != null) {
            try {
                String[] next = s.split(";");
                wordName = next[10];
                next[17] = next[17].replace("\"", "");
                if (stringIntegerHashMap.containsKey(wordName)) {
                    int[] ints = stringIntegerHashMap.get(wordName);
                    ints[0]++;
                    ints[1] += Integer.parseInt(next[17]);
                } else {
                    stringIntegerHashMap.put(wordName, new int[]{1, Integer.parseInt(next[17])});
                }
            } catch (NumberFormatException e) {
                System.out.println(e);
            }
        }
        for (Map.Entry<String, int[]> pair : stringIntegerHashMap.entrySet()) {
            int[] value = pair.getValue();
            System.out.printf("%s zayavki: %d interakcii: %d%n", pair.getKey(), value[0], value[1]);
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

}

Есть несколько важных моментов... 1. Исключение летит из-за того, что 0 у вас записан не просто как 0, а как "0". Это нельзя распарсить. Кавычки придется убирать руками, если вы хотите , чтобы ве работало. 2.В N-ной строке в ячейке, которую вы пытаетесь распарсить содержится просто текст. Тут задача совсем непосильная, сами решайте, что с этим текстом делать. 3. Парс - потенциально опасное место с точки зрения исключительных ситуаций. Посему настоятельно рекомендуется обрамлять такое блоками try-catch.

Итого, замену кавычек я добавил, блок try-catch тоже. В блоке обычный вывод в консоль сообщения с исключением, соответственно, при запуске увидите строку, текста, которую, разумеется, никак в цифры не превратишь, сами решите, что именно прописать в блоке try-catch уже в зависимости от бизнес-задачи. Удачи

Answer 2
Exception in thread "main" java.lang.NumberFormatException: For input string: ""0""

Сообщает о том, что вы пытаетесь преобразовать "0" в число. Но какому числу соответствует "?

перед переводом строки в число удалите оттуда все лишние

string.replaceAll("\"", ""); - в вашем случае
string.replaceAll("\\D", ""); - для удаления всех символов (не чисел)

Конкретно вам в блоке else перед вложением в мапу (31 строка) надо выполнить команды :

String number = next[17].replaceAll("\"", "");
int value = Integer.parseInt(number);

либо короче:

int value = Integer.parseInt(next[17].replaceAll("\"", ""));

и положить это в мапу.

READ ALSO
Операторы сдвига и побитовое НЕ JAVA

Операторы сдвига и побитовое НЕ JAVA

Опыты ставились над переменной int numberК двоичному виду приводил при помощи Integer

233
Как сохранить строковый массив?

Как сохранить строковый массив?

Пусть у меня есть массив testКак мне сделать так, чтобы он сохранялся в sharedPreferences при выходе из программы и загружался при входе?

202
Ключ шифрования не подходит

Ключ шифрования не подходит

Загружаю ключ из памяти телефона, декодирую из base64 в byte, получаю ключ и дальше уже работаю с нимНо при запуске программа выдает ошибку

151