Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.10.2016, 00:39   #1
AlexOrlo
Пользователь
 
Регистрация: 27.10.2016
Сообщений: 26
По умолчанию Сканер читает только первую строку

Всем здравствуйте.
Только начал изучать Java.
Написал код, который должен читать документ типа *.CSV
При этом второй столбец (столбцы в файле разделены знаком ";") сохраняет в массив.

Код:
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.util.Scanner;
import java.util.ArrayList;

public class mainframe
{

   public static void main (String[] args) throws IOException
   {
  
     String line;
     Scanner filescan, lineScan;
     ArrayList<Integer> table = new ArrayList<Integer>();
     int i=1, indx=0;
     String temp;
     
     filescan = new Scanner (new File("testt.CSV"));
  
     while (filescan.hasNext)
        
       {
                line = filescan.nextLine();
                lineScan = new Scanner (line);
                lineScan.useDelimiter(";");  
             
            while ((lineScan.hasNext())&&(!(i==2)))
            {
                i=1;
                  while (i!=2)
                     { 
                       temp=(lineScan.next());
                       i=i+1;
                      }                    
                 table.add (Integer.parseInt(lineScan.next()) );
                 indx=indx+1;
            }   
        }
Есть продолжение кода, но оно не важно..
Вот пример содержимого файла:


Base;52;9;0.6;59;346;330;E34578208; N31704875;16;12.1;15.9;27.7;100;11; 4;Stab;0;61;46;0:6:53;123;49;79;0;0 ;1109;703;2016-07-26;06:34:12;0.6;99.0
Base;72;11;2.1;64;354;328;E34578183 ;N31705037;16;12.1;15.9;27.7;100;6; 6;Stab;0;60;46;0:6:54;123;50;79;0;0 ;1065;701;2016-07-26;06:34:12;0.6;99.0
Base;90;13;2.7;68;358;350;E34578175 ;N31705212;16;12.1;15.9;26.6;110;12 ;14;Stab;0;65;46;0:6:55;123;50;79;0 ;0;1057;704;2016-07-26;06:34:12;0.6;99.0
Base;109;16;2.9;74;10;346;E34578203 ;N31705393;16;12.1;15.9;26.9;120;12 ;14;Stab;0;66;46;0:6:56;123;49;79;0 ;0;1057;686;2016-07-26;06:34:12;0.6;99.0
Base;129;19;2.9;75;16;350;E34578258 ;N31705580;16;12.1;15.9;26.9;130;11 ;20;Stab;0;64;46;0:6:57;122;50;79;0 ;0;1112;742;2016-07-26;06:34:12;0.6;99.0


Прикол в том, что сканер filescan не видит вторую строку текста и на втором круге filescan.hasNext выдаёт false. Если принудительно прописать while (i<50), то после запуска программы выскакивает : Java.util.NoSuchElementException: No line found.

Помогите разобраться пожалуйста.

Последний раз редактировалось AlexOrlo; 27.10.2016 в 00:55.
AlexOrlo вне форума Ответить с цитированием
Старый 27.10.2016, 07:57   #2
ultimatet41
Форумчанин
 
Аватар для ultimatet41
 
Регистрация: 08.04.2012
Сообщений: 104
По умолчанию

Код:
import java.io.*;
import java.util.ArrayList;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                new FileInputStream(new File("file.CSV"))));
        ArrayList<Integer> table = new ArrayList<Integer>();
        String temp = null;
        while ((temp = reader.readLine()) != null) {
            String[] tempArray = temp.split(";");
            table.add(Integer.parseInt(tempArray[1]));
        }
        printTable(table);
    }

    public static void printTable(ArrayList<Integer> arrayList) {
        for(int i : arrayList) {
            System.out.println(i);
        }
    }
}
ultimatet41 вне форума Ответить с цитированием
Старый 27.10.2016, 09:13   #3
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Попробуйте hasNextLine вместо hasNext

Последний раз редактировалось phomm; 27.10.2016 в 09:27.
phomm вне форума Ответить с цитированием
Старый 27.10.2016, 11:56   #4
AlexOrlo
Пользователь
 
Регистрация: 27.10.2016
Сообщений: 26
По умолчанию

ultimatet спасибо за рабочий код, но мне всё же интересно, почему не работает у меня.
phomm Вместо hasNext я не то, что hasNextLine пробовал, принудительно while (i<50) подсовывал (в текстовом файле больше тысячи строк). После чего выходит ошибка, которую озвучил в первом посте и подсвечивается строка line = filescan.nextLine();
Почему то сканер не видит больше одной строки..
AlexOrlo вне форума Ответить с цитированием
Старый 27.10.2016, 14:15   #5
ultimatet41
Форумчанин
 
Аватар для ultimatet41
 
Регистрация: 08.04.2012
Сообщений: 104
По умолчанию

У вас ошибка в коде

Код:
 i=1; // а так работает :)
while ((lineScan.hasNext())&&(!(i==2)))
            {
              //  i=1; так работать не будет
                  while (i!=2)
                     { 
                       temp=(lineScan.next());
                       i=i+1;
                      }                    
                 table.add (Integer.parseInt(lineScan.next()) );
                 indx=indx+1;
            }
ultimatet41 вне форума Ответить с цитированием
Старый 27.10.2016, 16:11   #6
AlexOrlo
Пользователь
 
Регистрация: 27.10.2016
Сообщений: 26
По умолчанию

ultimatet41
Спасибо большое! Работает!))
AlexOrlo вне форума Ответить с цитированием
Старый 31.10.2016, 02:45   #7
AlexOrlo
Пользователь
 
Регистрация: 27.10.2016
Сообщений: 26
По умолчанию

Не хочу плодить темы, поэтому продолжу спрашивать глупые вопросы здесь.
Задача получить окно с графиком собранным из значений массива.
При этом иметь возможность изменять его масштаб.
Мои действия: создал класс и метод к нему который записывает данные из файла в массив. Далее создал класс который рисует график и имеет алгоритм масштабирования. Далее создал панель на которую рисует предыдущий метод график. К этой же панели добавил текстовое поле, которое с помощью актион_листенер, читает содержимое и присваивает его к переменной масштабирования графика.
Тем самым хотелось бы в этом поле вводить коэффициент и график бы на лету масштабировался. Но конфуз в том, что график не меняется до того, как изменить размер окна.
То есть ввожу новое значение, ничего не происходит. Перевожу окно в полный режим и только после перерисовки окна график меняется.
Подскажите пожалуйста, где я затупил.
Могу выложить полный код если нужно, но вдруг и со слов понятно где я ошибся или недопонял..
AlexOrlo вне форума Ответить с цитированием
Старый 31.10.2016, 03:42   #8
AlexOrlo
Пользователь
 
Регистрация: 27.10.2016
Сообщений: 26
По умолчанию

Таксс, побродил по интернету, почитал.. Добавил repaint(); в конце графического блока. Теперь перерисовывается автоматом, но постоянно грузит ЦП.
Я так понимаю нужно добавить ещё какой то листенер...?
AlexOrlo вне форума Ответить с цитированием
Старый 31.10.2016, 13:13   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Добавил repaint(); в конце графического блока.
графический блок это отрисовка??
... // нарисовал
repaint(); и попросил НАРИСОВАТЬ еще раз(вызвать все тот же графический блок как только это будет возможно).

Repaint надо вызвать НЕ ИЗ графического блока, а ТАМ где настраиваются (изменяются) данные для отрисовки (параметры графика).

Цитата:
изменить размер окна.
это изменение параметров окна(hight, width) , и оно (это изменение) вызывает Repaint. что в свою очередь обеспечивает правильное рисование.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 31.10.2016, 13:38   #10
AlexOrlo
Пользователь
 
Регистрация: 27.10.2016
Сообщений: 26
По умолчанию

Всё, разобрался)) repaint(); добавил в ActionListener тех самых текстовых полей, которые задают масштабирование. Теперь всё работает чётко и ничего не грузит))
Спасибо evg_m!
AlexOrlo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MS Access+ComboBox (читает только до знака -) Denis3 БД в Delphi 1 15.08.2013 17:35
Цикл for. Пропустить первую строку webber9989 Общие вопросы Delphi 13 03.12.2012 12:20
Как рапечатать только первую страницу документов? Тандер Microsoft Office Word 1 25.06.2012 00:11
Прочитать первую строку из memo hacknet Работа с сетью в Delphi 1 22.10.2010 18:56
Почему читает лишнюю строку nusik Общие вопросы C/C++ 6 20.05.2009 18:22