Java, CSV, выдает ошибку, если не нажать на кнопку сохранения файла csv

#java #csv

#java #csv

Вопрос:

Это мой код

     public double myMethod(String name)
    {
        double result = 0.0;
        String path = "/Users/T/Desktop/Training/MyFolder/";
        int maxColumn = 0;
        BufferedReader br = null;
        ArrayList findMaxColumn = new ArrayList();
        String line = ""; 
        try
        {
            br = new BufferedReader(new FileReader(path name));
            while((line = br.readLine())!= null)
            {
                findMaxColumn.add(temp.split(",").length); 
            }
            maxColumn = getMaxNumber(findMaxColumn);
            CSVReader reader = new CSVReader(new FileReader(path name));
            List<String[]> myData =  reader.readAll();
            for(int i = 0 ; i < maxColumn;i  )
            {
                for (String[] lineData : myData) 
                {
                    String value= lineData[i];
  

Проблема в том, что у меня есть файл csv (сгенерированный другим методом и сохраненный в MyFolder), и когда я запускаю этот код, я получаю ошибку «ArrayIndexOutOfBoundsException: 1» при строковом значении = LineData[i] . Но, если я открою свой файл csv и нажму кнопку сохранения (или внесу некоторые изменения для значения, например, от 0 до 1 и т.д.) И закрою его перед запуском этого кода, тогда все будет хорошо, когда я его запущу. Это странно!!! Может ли кто-нибудь объяснить мне, почему я должен открыть файл csv и внести некоторые изменения (просто нажмите на кнопку сохранения или измените значение на другое), чтобы игнорировать проблему и как ее исправить?

Ответ №1:

Убедитесь, что ваша кодировка при сохранении файла совпадает с кодировкой, которую вы используете при чтении файла. Вполне может быть, что вы сохраняете, например, в UTF8 и читаете файл как UTF16.

Это соответствует тому, что вы описываете (если открыть и сохранить файл перед его чтением, тогда он работает), а также «ArrayIndexOutOfBoundsException: 1″» — показывает, что метод «split» не нашел разделителя (запятой), поэтому возвращает одну строку.

Это также помогло бы при использовании отладчика для проверки того, что находится в вашем массиве, который нужно добавить findMaxColumn после разделения. Легче отлаживать, если вы используете локальную переменную для сохранения результата split перед добавлением:

         while((line = br.readLine())!= null)
        {
            String splitResult[]=temp.split(","); // easier to examine
            findMaxColumn.add(splitResult); 
        }
  

Комментарии:

1. Спасибо за ваш ответ. Сейчас я проверю свою часть кодирования и сообщу вам.