Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/34: Рейтинг темы: голосов - 34, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 19.01.2014
Сообщений: 51

Scanner построчное считывание с дальнейшим делением строки на объекты

22.01.2014, 16:43. Показов 6344. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток форумчане)))
Помогите пожалуйста решить вопрос.

Есть текстовый файл, в нем записаны строки вида

D05 T1235 U54115
D09 T5845 U5478 H548


Нужно считать строку, проверить первый объект после чего получить следующие несколько параметров причём количество параметров зависит от первого объекта строки. Далее перейти на следующую строку.

Насколько я понял нужно использовать в сканере оператор while(in.hasNextLine()) после чего создать цикл который считает следующие несколько объектов после проверки первого. В общем то проблема с концепцией как это выглядит, как заставить цикл перехода к следующему объекту сработать определённое количество раз.

Заранее благодарен за помощь)))))
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.01.2014, 16:43
Ответы с готовыми решениями:

Построчное считывание с файла до конца строки
Можно ли применить в цикле такую конструкцию: while(!\n){} , чтобы прога считывала только до конца одной строки?

Считывание MD5 с файлов и преход на Form2 с дальнейшим указанием действий
Пользуясь этой темой как основой, попытался сделать так: При запуске программы идет считывание MD5 из файлов. Далее при отсутствии...

Scanner, считывание double
Вот код (вычисление среднего арифметического введенных в консоли вещественных чисел): import java.util.*; class AvgNums { ...

11
ɐwʎ ɔ vǝmоɔ dиw ɐʚонɔ
 Аватар для tankomaz
443 / 442 / 100
Регистрация: 14.10.2012
Сообщений: 1,146
Записей в блоге: 9
22.01.2014, 18:22
вот вам на пример будет читалка файла по строке, а со строкой уже делайте что хотите
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.io.*;
 
public class Test{
 
    public static void main(String[] args) throws IOException {
        getStringsFromFile("D:\\textIn.txt");
    }
 
    public static void getStringsFromFile(String fileName) throws IOException {
        File file = new File(fileName);
        BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
        String tempString = null;
 
        while ((tempString = bufferedReader.readLine()) != null) {
            System.out.println(tempString);
        }
    }
 
 
}
0
0 / 0 / 0
Регистрация: 19.01.2014
Сообщений: 51
22.01.2014, 20:01  [ТС]
Что то как то не выходит(((
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import java.io.*;
import java.util.Scanner;
 
public class Test{
 
    public static void main(String[] args) throws IOException {
        getStringsFromFile("res//cnc.txt");
    }
 
    public static void getStringsFromFile(String fileName) throws IOException {
        File file = new File(fileName);
        @SuppressWarnings("resource")
        BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
        String tempString = null;
 
        while ((tempString = bufferedReader.readLine()) != null) {
            System.out.println(tempString);
            @SuppressWarnings("resource")
            Scanner in = new Scanner(tempString);
            String command = in.next();
            char code =  command.charAt(0);
            int v = Integer.parseInt(command.substring(1));
            while(in.hasNext()){
                
                 if(code=='G'){
                    if(v==1){
                         System.out.println(v);
                    }
                    
                 }
            }
            
        }
    }
 
 
}
Выкидывает:
(* Asper 3.5.1 SVN=6625 Build date: Mar 14 2013, time: 13:27:46 *)
Exception in thread "main" java.lang.NumberFormatException: For input string: "*"
at java.lang.NumberFormatException.forInput String(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at Test.getStringsFromFile(Test.java:22)
at Test.main(Test.java:7)

Добавлено через 6 минут
переменную переместил в if(code=='G')

теперь в консоль выкидывает только:
(* Asper 3.5.1 SVN=6625 Build date: Mar 14 2013, time: 13:27:46 *)

я так думаю не переходит на следующую строку((((

Добавлено через 18 минут
В общем получилось так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import java.io.*;
import java.util.Scanner;
 
public class Test{
 
    public static void main(String[] args) throws IOException {
        getStringsFromFile("res//cnc.txt");
    }
 
    public static void getStringsFromFile(String fileName) throws IOException {
        File file = new File(fileName);
        @SuppressWarnings("resource")
        BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
        String tempString = null;
 
        while ((tempString = bufferedReader.readLine()) != null) {
           
            @SuppressWarnings("resource")
            Scanner in = new Scanner(tempString);
            String command = in.next();
            char code =  command.charAt(0);
           
            if(in.hasNext()){
                
                 if(code=='G'){
                    int v = Integer.parseInt(command.substring(1));
                    if(v==1){
                         System.out.println(v);
                    }
                    
                 }
                 if(code=='X'){
                     command = command.replace('(' , ' ');
                     command = command.replace('*' , ' ');
                     double v = Double.parseDouble(command.substring(1));
                    
                    System.out.println("Координата X" + v);
                }
                if(code=='Y'){
                     command = command.replace('(' , ' ');
                     command = command.replace('*' , ' ');
                     double v = Double.parseDouble(command.substring(1));
                     System.out.println("Координата Y" + v);
                }
            }
            
        }
    }
 
 
}
Но строка не делится на объекты, поэтому читается только первый символ "G" а X и Y не считываются
0
ɐwʎ ɔ vǝmоɔ dиw ɐʚонɔ
 Аватар для tankomaz
443 / 442 / 100
Регистрация: 14.10.2012
Сообщений: 1,146
Записей в блоге: 9
22.01.2014, 20:07
String[] array = string.split(" ");
поделит ваш string на части по знаку "пробел", а вы куда-то не туда пошли

Добавлено через 2 минуты
укажите вообщем что за "объект" вы имеете ввиду, первая буква может? по ней идет дальнейшая обработка? напишите что хотите получить в конечном итоге, если хотите - делайте сами, я свою версию выбрасывать сюда не буду, но хоть буду понимать правильно ли помогаю
0
0 / 0 / 0
Регистрация: 19.01.2014
Сообщений: 51
22.01.2014, 20:08  [ТС]
Уточните пожалуйста начинающему куда массив запихнуть))))
0
ɐwʎ ɔ vǝmоɔ dиw ɐʚонɔ
 Аватар для tankomaz
443 / 442 / 100
Регистрация: 14.10.2012
Сообщений: 1,146
Записей в блоге: 9
22.01.2014, 20:09
напишите тех. задание и дайте строк 5 исходного файла и покажите что вы хотите получать с этих 5ти строк
0
0 / 0 / 0
Регистрация: 19.01.2014
Сообщений: 51
22.01.2014, 20:30  [ТС]
Кусок исходного кода:
(* Asper 3.5.1 SVN=6625 Build date: Mar 14 2013, time: 13:27:46 *)
(* Используемые инструменты: *)
(* верхняя фаска - T211 *)
(* Прямой рез - T111 *)
(* ------------ *)
(*Thickness = 12.00*)
"SHEET_DIM 6000 1500 9000000 12.00 7850 MST
G90 (* ABSOLUTE *)
"PART 44076.25.421ф 94 3717 2517.00 557.00
"SIZE = 60 x 68
M6 T211 (* SET TOOL *)
G0 X0 Y0
M94 D1(* BEGIN SURFACE DETECTION *)
G94 X2517.001 Y534.999 (* DETECT ONE POINT *)
G94 X2547.001 Y534.999 (* DETECT ONE POINT *)
M94 (*END OF SURFACE DETECTION*)
G0 X2559.001 Y534.999(* TRAVERSE *)
G0 B180.00 (* SET AZIMUTH *)
G41 (* COMPENSATION LEFT *)
M38 L0.00 L0.00 (* AZIMUT LIMITS *)
M29 A-45.00 (* SET CHAMFER *)
M37 (* AZIMUT NOW *)
M20 D2 (*HEAD DOWN *)
M3 (* TOOL ON *)
G1 X2553.001(* LEAD IN *)
G1 X2547.001(* LEAD IN *)
M28 (* TANG CTRL ON *)
G1 X2537.001(* BEVEL CONTOUR *)
M90 K11 L0 (*LEARN MODE *)
M22 D11 (*LEARN MODE - START LEARNING*)
G1 X2517.001(* BEVEL CONTOUR *)
M23 D11 (*LEARN MODE - STOP LEARNING*)
M22 D10 (*3D OFF*)
M22 (* ADAPT. ON *)
G1 X2487.001(* BEVEL CONTOUR *)
M27 (* TANG CTRL OFF *)
G1 X2481.001(* LEAD OUT *)
M5 (* TOOL OFF *)
M90 K111 L100 (*RECALL VOLTAGE *)
M21 (* PARK *)
G40 (* COMPENSATION OFF *)
M32 (* PARK ROTATOR *)
M6 T111 (* SET TOOL *)
G0 X2481.001 Y534.999
G0 X2487.001 Y510.999(* TRAVERSE *)
G41 (* COMPENSATION LEFT *)
M20 (*HEAD DOWN *)
M3 (* TOOL ON *)
G1 Y522.999(* LEAD IN *)
G1 Y560.999(* LINE - CONTOUR *)
G2 X2547.001 Y560.999 I2517.0008 J560.9995(* ARC CW - CONTOUR *)
G1 Y522.999(* LINE - CONTOUR *)
G1 Y516.999(* LEAD OUT *)
M5 (* TOOL OFF *)
M21 (* PARK *)
G40 (* COMPENSATION OFF *)

В строке первое значение это основная команда за ней следуют несколько значений таких как X,Y,A,B. Из этих строк нужно получить числовое значение (все что идет после букв).

Конечная цель получить строку G94 X2517.001 Y534.999(выделена цветом) и отправить её в бд sqlite
вида: команда X Y
G94 2517.001 534.999

проблема в том что в команде G94 может отсутствовать X или Y и в отсутствующему значению присвоить 0, поэтому я и пытаюсь проверять циклом. Конечно если бы данные были строго структуризированы то можно обойтись массивом либо я чего не знаю)))

Добавлено через 1 минуту
при этом еще и куча мусора в исходном файле(все что указанно в (* *) ну и самые первые строки тоже не нужны)
0
ɐwʎ ɔ vǝmоɔ dиw ɐʚонɔ
 Аватар для tankomaz
443 / 442 / 100
Регистрация: 14.10.2012
Сообщений: 1,146
Записей в блоге: 9
22.01.2014, 20:31
а такое попадать не должно?
G1 Y522.999(* LEAD IN *)
или
G1 X2487.001(* BEVEL CONTOUR *)
?

просто по идеет напрашивается Regexp
0
0 / 0 / 0
Регистрация: 19.01.2014
Сообщений: 51
22.01.2014, 20:48  [ТС]
Из этого должно попасть
в поле команда - G1
в поле X-0
в поле Y-522.999

в поле команда - G1
в поле X-2487.001
в поле Y-0

Добавлено через 4 минуты
И еще вся эта каша будет на андроиде)))

Добавлено через 4 минуты
Начинал пробовать так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;
 
public class MyTime {
        
    
    @SuppressWarnings("resource")
    public static void main(String[] args) throws FileNotFoundException {
 
        Scanner in = new Scanner(new FileInputStream("res//1.txt"));
        
        
          while(in.hasNext()){
            String command = in.next();
            char code = command.charAt(0);
            if(code=='G'){
                 int v = Integer.parseInt(command.substring(1));
                    if(v==0){
                         System.out.println("Команда G" + v);    
                    } 
                    if(v==1){
                         System.out.println("Команда G" + v);
                    } 
                    if(v==2){
                         System.out.println("Команда G" + v);
                    } 
                    if(v==3){
                         System.out.println("Команда G" + v);
                    } 
                    if(v==94){
                         System.out.println("Команда G" + v);
                    } 
            } 
            if(code=='M'){
                char cod = command.charAt(1);
                if(cod!='a'){
                    if(cod!='S'){
                        if(cod!='O'){
                            int v = Integer.parseInt(command.substring(1));
                            if(v==3){
                                System.out.println("Включить работу инструмента M" + v);   
                            }
                            if(v==5){
                                System.out.println("Выключить работу инструмента M" + v); 
                            } 
                            if(v==6){
                                System.out.println("Загрузка инструмента M" + v);    
                            } 
                            if(v==21){
                                System.out.println("Парковка M" + v);   
                            } 
                            if(v==29){
                                System.out.println("Команда M" + v);
                            }
                            if(v==32){
                                System.out.println("Парковка ротатора M" + v);  
                            } 
                        } 
                    }
                }
            }
            if(code=='X'){
                 command = command.replace('(' , ' ');
                 command = command.replace('*' , ' ');
                 double v = Double.parseDouble(command.substring(1));
                
                System.out.println("Координата X" + v);
            }
            if(code=='Y'){
                 command = command.replace('(' , ' ');
                 command = command.replace('*' , ' ');
                 double v = Double.parseDouble(command.substring(1));
                 System.out.println("Координата Y" + v);
            }
            if(code=='B'){
                char cod = command.charAt(1);
                if(cod!='u'){
                    if(cod!='E'){
                    double v = Double.parseDouble(command.substring(1));
                    System.out.println("Угол поворота оси B" + v);
                    }
                }
            }
            if(code=='A'){
                char cod = command.charAt(1);
                if(cod!='s'){
                    if(cod!='B'){
                        if(cod!='Z'){
                            if(cod!='D'){
                                if(cod!='R'){
                                    double v = Double.parseDouble(command.substring(1));
                                    System.out.println("Угол поворота оси B" + v);
                                }
                            }
                        }
                    }
                }
            }
            if(code=='I'){
                char cod = command.charAt(1);
                if(cod!='N'){
                    double v = Double.parseDouble(command.substring(1));
                    System.out.println("Параметр I" + v);
                } 
            }
            if(code=='J'){
                 command = command.replace('(' , ' ');
                 command = command.replace('*' , ' ');
                 double v = Double.parseDouble(command.substring(1));
                 System.out.println("Параметр J" + v);
            }
        }
    }
}
Но не понял как сформировать строку для отправки в БД
0
ɐwʎ ɔ vǝmоɔ dиw ɐʚонɔ
 Аватар для tankomaz
443 / 442 / 100
Регистрация: 14.10.2012
Сообщений: 1,146
Записей в блоге: 9
23.01.2014, 14:06
вообщем смотрите что получилось
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package pack;
 
import java.io.*;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class Test{
 
    public static void main(String[] args) throws IOException {
        ArrayList<String> listWithCommands = getCommandsToDB("D:\\textIn.txt");
        for (String s : listWithCommands) {
            System.out.println(s);
        }
    }
 
    public static ArrayList<String> getCommandsToDB(String fileName) throws IOException {
        ArrayList<String> forReturnList = new ArrayList<>();
        String stringWithText = null;
        BufferedReader bufferedReader = new BufferedReader(new FileReader(new File(fileName)));
        StringBuilder stringBuilder = new StringBuilder();
        while((stringWithText = bufferedReader.readLine()) != null) {
            stringBuilder.append(stringWithText + "\n");
        }
 
        Pattern pattern = Pattern.compile("([A-Z][0-9]{1,3})\\s(X|Y)([0-9]+\\.?[0-9]+)\\s?((X|Y)([0-9]+\\.?[0-9]+))?");
        Matcher matcher = pattern.matcher(stringBuilder.toString());
        String mainGroup = null;
        double x = 0;
        double y = 0;
        while (matcher.find()) {
 
            mainGroup = matcher.group(1);
            x = (matcher.group(2).equals("X")) ? Double.parseDouble(matcher.group(3)) : 0;
            y = (matcher.group(2).equals("Y")) ? Double.parseDouble(matcher.group(3)) : 0;
 
            x = (matcher.group(5) != null && matcher.group(5).equals("X")) ? Double.parseDouble(matcher.group(6)) : x;
            y = (matcher.group(5) != null && matcher.group(5).equals("Y")) ? Double.parseDouble(matcher.group(6)) : y;
 
            forReturnList.add(mainGroup + " " + x + " " + y);
 
        }
        return forReturnList;
    }
 
}
вроде бы даже правильно работает
вынес всю кашу в отдельный метод, чтобы вы не заморачивались с интеграцией в программу, все команды (как вы хотели) находятся в ArrayList<String> listWithCommands, тойсь по очереди можете вызывать ячейки - и добавлять в БД
0
0 / 0 / 0
Регистрация: 19.01.2014
Сообщений: 51
23.01.2014, 18:07  [ТС]
Вам огромное спасибо))) Но так как я только начал учиться благородному делу программированию у меня возник вопрос есть ли какая нибудь у Вас ссылка на информацию или литературу чтобы разобраться с данным кодом. Именно интересует matcher.group и pattern.

Добавлено через 3 минуты
Просто нужны не только G1 и G2 но и остальные, а Вас нагружать не попытавшись самому разобраться как то неудобно
0
ɐwʎ ɔ vǝmоɔ dиw ɐʚонɔ
 Аватар для tankomaz
443 / 442 / 100
Регистрация: 14.10.2012
Сообщений: 1,146
Записей в блоге: 9
23.01.2014, 19:28
Это Вам читать про Regexp нужно в первую очередь, а дальше класс Pattern, Matcher из документации
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.01.2014, 19:28
Помогаю со студенческими работами здесь

Поправить считывание Scanner
При считывании элемента в функции add() - считывает число in.nextInt() а затем in.nextLine() почему то не запрашивая ввод считывает пустую...

построчное считывание
ХЕЛП! while (!feof($file)) { $buffer = fgets ($file, 4096); print $buffer; } fclose ($file); А как сделать...

Построчное считывание
пытаюсь прочитать файл типа ----test.txt----- /home/roman/s.tests1.ls /home/roman/s.tests2.ls читаю сразу массив строк из...

Построчное считывание
Здравствуйте, у меня вопрос по WindowsForms: Допустим, есть окошко с текстом, как построчно считать весть текст из этого окошка (потом...

Построчное считывание файла
В файле у меня все строки вида: \x53\x74\x69\x6C\x6C\x2E\x2E\x2E\x00 Код считывающий файл построчно: ifstream i(&quot;first.dlg&quot;);...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru