Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
blackeangel
6 / 6 / 1
Регистрация: 22.07.2015
Сообщений: 547
1

Чтение из текстового файла строковых данных в двумерный массив java8

23.05.2017, 15:04. Просмотров 912. Ответов 18

Собственно как это сделать?
Scanner использовать или reader или что?
Использовать List<List<Double>> matr = new LinkedList<>(); для подсчёта строк в файле?
Сильно не пинайте, но только начинаю изучать.
Выручайте, ребята.
Как вариант считать в одномерный, а потом переделать в двумерный массив с использованием регулярки.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.05.2017, 15:04
Ответы с готовыми решениями:

Чтение текстового файла. Парсинг его данных. Создание исключений для данных. Запись свойств объектов в файл
Проблема такая. Есть файл data.txt. В нем например какие-то данные. Landon...

Чтение таблицы из txt файла в двумерный массив
Всем добрый день, Помогите с реализацией кода, нужен способ чтения табличного...

Работа с двумерными массивами. Чтение данных из текстового файла и запись в текстовый файл
В матрице А найти отношение количества нулевых элементов в количестве...

Как заменить чтение строки из консоли на чтение текстового файла?
основное задание: найти частоту суффикса (например, &quot;ing&quot;) в текстовом...

Чтение данных из файла в массив
задачка такая: дан файл f, где целые числа, нет нулей, причем количество...

18
xoraxax
1449 / 1347 / 400
Регистрация: 05.07.2013
Сообщений: 6,511
Завершенные тесты: 2
23.05.2017, 15:25 2
че сделать то надо? зачем двумерный массив?
0
blackeangel
6 / 6 / 1
Регистрация: 22.07.2015
Сообщений: 547
23.05.2017, 15:29  [ТС] 3
xoraxax, работать дальше с ним, перебирать, в файл выводить и тд и тп.
А пока надо файл прочитать в двумерный массив. В файле дерево каталогов в первом столбце, во втором столбце их вес, в третьем разрешения. Все разделено пробелами.
0
xoraxax
1449 / 1347 / 400
Регистрация: 05.07.2013
Сообщений: 6,511
Завершенные тесты: 2
23.05.2017, 17:42 4
Files.lines.map(line->line.split("\\W+"))
ну и дальше в таком же духе можешь на класс какой-нибудь замапить, например. Примеров на форуме довольно много.
0
blackeangel
6 / 6 / 1
Регистрация: 22.07.2015
Сообщений: 547
24.05.2017, 20:41  [ТС] 5
xoraxax, ну а с использованием регулярки? Типа такой на
Visual Basic
1
objRegExp.Pattern = "^(.+) (\d+) (\d+) (\d+)(?:| (.+))$"
Только на java? Чтоб получилось 5 столбцов

Добавлено через 17 часов 6 минут
xoraxax, а сразу с регуляркой можно прочитать и разбить на столбцы?

Добавлено через 6 часов 52 минуты
вроде что то заработало
Java
1
2
3
4
5
6
7
8
9
                try {
                    Path path = Paths.get(pathStatfile);
                    String[][] array = Files.lines(path)
                            .map(s -> s.split("^(.*) (\\d+) (\\d+) (\\d+)(?:| (.*))$"))
//                            .map(s -> s.split(" "))
                            .toArray(String[][]::new);
                    System.out.println(Arrays.toString(array));
                } catch (IOException e1) {
                }
но почему то все значения пустые
Что то в регулярке не то. Что именно?
0
korvin_
24.05.2017, 21:36
  #6

Не по теме:

При использовании Files.lines нужно не забывать закрывать поток

0
blackeangel
6 / 6 / 1
Регистрация: 22.07.2015
Сообщений: 547
24.05.2017, 23:12  [ТС] 7
пример входящих строк такой
Код
system/lost+found 0 0 770
system/app 0 0 755
system/app/AnalyticsCore 0 0 755
system/app/AnalyticsCore/AnalyticsCore.apk 0 0 644
system/app/AnalyticsCore/oat 0 0 755
system/app/AnalyticsCore/oat/arm64 0 0 755
system/app/AnalyticsCore/oat/arm64/AnalyticsCore.odex 0 0 644
system/app/AntHalService 0 0 755
system/app/AntHalService/AntHalService.apk 0 0 644
system/app/AntHalService/oat 0 0 755
system/app/AntHalService/oat/arm64 0 0 755
system/app/AntHalService/oat/arm64/AntHalService.odex 0 0 644
0
xoraxax
1449 / 1347 / 400
Регистрация: 05.07.2013
Сообщений: 6,511
Завершенные тесты: 2
24.05.2017, 23:36 8
Java
1
2
3
Files.lines(Paths.get(PATH))
                .map(line -> line.split("\\s+"))
                .collect(toMap(split -> split[0], split -> Arrays.stream(split).skip(1).map(Integer::parseInt).collect(toList())));
проверок всяких нет, потому что лень, стрим тоже лень закрывать.
1
we2seek
80 / 80 / 42
Регистрация: 25.01.2010
Сообщений: 385
25.05.2017, 00:10 9
xoraxax, немного эффективнее вот так:
Java
1
2
3
4
5
6
try (Stream<String> stream = Files.lines(Paths.get(PATH))) {
    stream
        .map(line -> line.split("\\s+"))
        .collect(toMap(split -> split[0], split -> Arrays.stream(split).skip(1).map(Integer::parseInt).collect(toList())));
 
}
0
blackeangel
6 / 6 / 1
Регистрация: 22.07.2015
Сообщений: 547
25.05.2017, 05:25  [ТС] 10
we2seek, xoraxax, а если пробел в имени файла? То все, приплыли? Нет, ребят, сплит по пробелам тут не катит. Регулярка нужна.
0
xoraxax
1449 / 1347 / 400
Регистрация: 05.07.2013
Сообщений: 6,511
Завершенные тесты: 2
25.05.2017, 08:39 11
Цитата Сообщение от blackeangel Посмотреть сообщение
если пробел в имени файла
если ты знаешь, что у тебя три числа - доставай их из трех последних элементов сплита, то что останется, отдашь в String.join
0
blackeangel
6 / 6 / 1
Регистрация: 22.07.2015
Сообщений: 547
25.05.2017, 14:41  [ТС] 12
xoraxax, хорошо, а при таких строках это уже не покатит
Код
system/app/PicoTts/lib/arm/libttscompat.so 0 0 644 /system/lib/libttscompat.so
system/app/PicoTts/lib/arm/libttspico.so 0 0 644 /system/lib/libttspico.so
0
xoraxax
1449 / 1347 / 400
Регистрация: 05.07.2013
Сообщений: 6,511
Завершенные тесты: 2
25.05.2017, 15:15 13
Цитата Сообщение от blackeangel Посмотреть сообщение
xoraxax, хорошо, а при таких строках это уже не покатит
ну печаль беда теперь.
Определись сначала, что именно ты парсить хочешь, потом думать будешь, как это делать.
А что если имя файла будет path/qwe 1 2 3 asd.txt, как ты тогда поймешь, где оно заканчивается?
Если ты сам файл формируешь, используй вместо пробела другой разделитель.
Если не сам, а кто-то другой, посмотри в каком формате он генерирует файлы.
0
blackeangel
6 / 6 / 1
Регистрация: 22.07.2015
Сообщений: 547
25.05.2017, 15:40  [ТС] 14
xoraxax,
Такую строку схавал как надо
system/app/AguiAcc AndAlsps Calibration/lib/arm 6 4/libgse nsorca li_jni .so 0 0 777
0
xoraxax
1449 / 1347 / 400
Регистрация: 05.07.2013
Сообщений: 6,511
Завершенные тесты: 2
25.05.2017, 15:41 15
Цитата Сообщение от blackeangel Посмотреть сообщение
Такую строку схавал как надо
я рад за тебя, в чем вопрос то тогда?
0
blackeangel
6 / 6 / 1
Регистрация: 22.07.2015
Сообщений: 547
25.05.2017, 15:50  [ТС] 16
xoraxax, вопрос то в 12 посте.

Добавлено через 5 минут
Хотя правильнее будет сформулировать задачу так:
Необходимо прочитать текстовый файл в двумерный массив. В массиве должно быть 6 столбцов. 6й столбец пустой.
0
blackeangel
6 / 6 / 1
Регистрация: 22.07.2015
Сообщений: 547
25.05.2017, 15:51  [ТС] 17
И приложить файл
0
Вложения
Тип файла: zip stat.zip (42.8 Кб, 5 просмотров)
blackeangel
6 / 6 / 1
Регистрация: 22.07.2015
Сообщений: 547
25.05.2017, 15:55  [ТС] 18
Так будет вернее.
В массиве:
Столбец0: путь к файлу и имя файла
Столбец1-столбец3: права
Столбец4: пустой и заполненный в зависимости от наличия заполнителя
Столбец4:пустой

Добавлено через 10 секунд
Так будет вернее.
В массиве:
Столбец0: путь к файлу и имя файла
Столбец1-столбец3: права
Столбец4: пустой и заполненный в зависимости от наличия заполнителя
Столбец4:пустой
0
v777779
162 / 168 / 138
Регистрация: 28.11.2016
Сообщений: 301
25.05.2017, 17:38 19
Кликните здесь для просмотра всего текста
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
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
 
public class FolderRegex {
    static class Entry {
        private String path;
        private int val1;
        private int val2;
        private int val3;
 
        public Entry(String path, int val1, int val2, int val3) {
            this.path = path;
            this.val1 = val1;
            this.val2 = val2;
            this.val3 = val3;
        }
 
        public Entry(String s) {
            String[] strings = s.trim().split(" +");
            if (strings.length < 4) {
                throw new RuntimeException("Wrong input String");
            }
            this.path = strings[0];
            this.val1 = Integer.valueOf(strings[1]);
            this.val2 = Integer.valueOf(strings[2]);            
            this.val3 = Integer.valueOf(strings[3]);
            
        }
 
        public String getName() {
            return path;
        }
 
        public int getVal1() {
            return val1;
        }
 
        public int getVal2() {
            return val2;
        }
 
        public int getVal3() {
            return val3;
        }
 
        @Override
        public String toString() {
            return path + "  " + val1 + " " + val2 + " " + val3;
        }
    }
 
 
    public static void main(String[] args) {
        String s;
        String regex = "([\\w*/\\.\\+]+ +\\d* +\\d* +\\d*)+";
 
        List<Entry> list = new ArrayList<>();
 
        try {
            Scanner in = new Scanner(new BufferedReader(new FileReader("C:\\temp\\stat.txt")));
// parser
            while (in.hasNext()) {
                s = in.nextLine();
                Matcher m = Pattern.compile(regex).matcher(s);
                while (m.find()) {
                    Entry entry = new Entry(m.group());
                    list.add(entry);
                }
            }
            int count = 0;
            System.out.println("Found: " + list.size() + " entries");
            for (Entry entry : list) {
                System.out.println("Entry " + count++ + " :" + entry);
            }
 
            in.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
 
    }
}

Вот парсер, вытаскивает все записи из файла приведенного выше.
Создает список, с классом Entry в котором все данные распределены по полям.
Из списка массив надеюсь сами легко сделаете, у Entry есть все методы для этого.
Проверяйте.
1
25.05.2017, 17:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.05.2017, 17:38

Как из данных, считанных из текстового файла, Char перевести данные в массив Int?
Всем привет! Я не так давно начал изучать 'жабу' и возможно мой вопрос...

Чтение текстового файла
Пробую читать текстовой файл. package javaapplication3; import java.io.*;...

Чтение из текстового файла
у меня вопрос вопросов )) import java.io.*; class OpenFile { int array =...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru