Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Java - [решено] Чтение из текстового файла строковых данных в двумерный массив java8

Ответить
Настройки темы
Java - [решено] Чтение из текстового файла строковых данных в двумерный массив java8

Аватара для blackeangel

Старожил


Сообщения: 329
Благодарности: 3

Профиль | Отправить PM | Цитировать


Собственно как это сделать?
Scanner использовать или reader или что?
Использовать List<List<Double>> matr = new LinkedList<>(); для подсчёта строк в файле?
Сильно не пинайте, но только начинаю изучать.
Выручайте, ребята.
Как вариант считать в одномерный, а потом переделать в двумерный массив с использованием регулярки

Отправлено: 15:05, 23-05-2017

 

Аватара для blackeangel

Старожил


Сообщения: 329
Благодарности: 3

Профиль | Отправить PM | Цитировать


Цитата shisik:
Так должно работать с пробелами в именах файлов:

Код: Выделить весь код
split("\\s(?=\\d+(?:\\s\\d+)?(?:\\s\\d+)?$)")
Ура! Заработало) Спасибо огромное!)

Отправлено: 11:59, 25-05-2017 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для blackeangel

Старожил


Сообщения: 329
Благодарности: 3

Профиль | Отправить PM | Цитировать


А как теперь доработать ту регулярку так, чтобы ещё можно было захватить и такие строки
Код: Выделить весь код
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
?
Тоже с пробелами если попадуться?
Просто в файле встречаются и такие строки тоже.

Отправлено: 12:44, 25-05-2017 | #12


Аватара для shisik

Ветеран


Сообщения: 3247
Благодарности: 596

Профиль | Отправить PM | Цитировать


Похоже, split для этого не годится. А что если так?

Код: Выделить весь код
private static String [] parseLine(String line) {
    ArrayList<String> result = new ArrayList<String>();
    Pattern pattern = Pattern.compile("^(.+?)\\s(\\d+)\\s(\\d+)\\s(\\d+)(?:\\s(.+?))?$");
    Matcher matcher = pattern.matcher(line);
    while (matcher.find()) {
        result.add(matcher.group());
    }
    return result.toArray(new String[0]);
}

//...

    String[][] array = Files.lines(path)
        .map(s -> parseLine(s))
        .toArray(String[][]::new);

Отправлено: 14:50, 25-05-2017 | #13


Аватара для blackeangel

Старожил


Сообщения: 329
Благодарности: 3

Профиль | Отправить PM | Цитировать


shisik, почему не годится?

И такой метод не разбивает - все в одну строку пишет.

Последний раз редактировалось blackeangel, 25-05-2017 в 15:34.


Отправлено: 15:06, 25-05-2017 | #14


Аватара для shisik

Ветеран


Сообщения: 3247
Благодарности: 596

Профиль | Отправить PM | Цитировать


Потому что в методе split регулярка задаёт шаблон разделителя, а не всей разделяемой строки. Пока в строке после имени файла ожидались лишь цифры и пробелы, можно было проделать трюк с проверкой на наличие таких символов после пробела и таким образом не считать разделителем пробелы внутри имени файла. Если после этого пробела есть символы, не удовлетворяющие условию, например, буквы. Именно это делает часть

Код: Выделить весь код
(?=\\d+(?:\\s\\d+)?(?:\\s\\d+)?$)
до конца строки не должно быть ничего кроме максимум трёх чисел, разделённых пробелами. К слову, примерно то же самое можно написать проще, но всё равно не спасает:

Код: Выделить весь код
\\s(?![^\\d\\s]+$)
Можно пытаться дальше развивать этот шаблон, но в конечном итоге в имени файла может встретиться числа, окруженное пробелами, например File 123 name.txt - и всё, в любом случае это число будет выделено в отдельный элемент массива, а не будет частью имени файла, как должно быть. Так что этот путь тупиковый, в смысле использование split.

А вот написать регулярку, соответствующую всей строке целиком - это возможно и совсем несложно. Что и сделал. Но только тогда split уже не годится.

Отправлено: 15:45, 25-05-2017 | #15


Аватара для blackeangel

Старожил


Сообщения: 329
Благодарности: 3

Профиль | Отправить PM | Цитировать


Вот файл в котором есть варианты разновидностей.

В массиве надо получить следующее:
Столбец0: путь к файлу и имя файла
Столбец1-столбец3: права(0 0 0764)
Столбец4: пустой и заполненный в зависимости от наличия заполнителя
Столбец5:пустой

Последний раз редактировалось blackeangel, 30-05-2017 в 20:39.


Отправлено: 15:57, 25-05-2017 | #16


Аватара для blackeangel

Старожил


Сообщения: 329
Благодарности: 3

Профиль | Отправить PM | Цитировать


shisik, то есть надо использовать 2 массива:в один читаем файл, во второй этот массив раскладывается по столбцам при помощи регулярки?

Отправлено: 16:00, 25-05-2017 | #17


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата blackeangel:
Вот файл… »
Ура! К шашнадцатому сообщению Вы таки об ентом вспомнили.

Отправлено: 16:40, 25-05-2017 | #18


Аватара для shisik

Ветеран


Сообщения: 3247
Благодарности: 596

Профиль | Отправить PM | Цитировать


Цитата blackeangel:
надо использовать 2 массива:в один читаем файл, во второй этот массив раскладывается по столбцам при помощи регулярки? »
Почти. Файл читается в стрим Stream<String>. Метод map применяет некоторую функцию к каждому элементу стрима (строке из файла), результатом которой является массив строк, то есть на выходе имеем Stream<String[]>. Затем toArray преобразовывает стрим в массив с теми эже элементами, что были в стриме, то есть в String[][]. Когда я говорил разбить цепочку вызовов на отдельные части, я имел в виду что-то типа такого:

Код: Выделить весь код
Stream<String> str_stream = Files.lines(path);
Stream<String[]> arr_stream = str_stream.map(s -> parseLine(s));
String[][] array = arr_stream.toArray(String[][]::new);
Цитата blackeangel:
В массиве надо получить следующее:
Столбец0: путь к файлу и имя файла
Столбец1-столбец3: права(0 0 0764)
Столбец4: пустой и заполненный в зависимости от наличия заполнителя
Столбец4:пустой »
Не понял: два раза «столбец 4»? Наверно, последняя строка не нужна. Просто

0: имя файла
1 - 3: права
4 - или всё, что после прав, или ничего.

Так? В общем, вот:

Код: Выделить весь код
private static String [] parseLine(String line) {
    ArrayList<String> result = new ArrayList<String>();
    Pattern pattern = Pattern.compile("^(.+?)\\s(\\d+)\\s(\\d+)\\s(\\d+)(?:\\s(.+?))?$");
    Matcher matcher = pattern.matcher(line);
    if (matcher.find()) {
        for (int i = 1; i <= matcher.groupCount(); ++i) {
            result.add(matcher.group(i));
        }
    }
    return result.toArray(new String[0]);
}

Отправлено: 17:08, 25-05-2017 | #19


Аватара для blackeangel

Старожил


Сообщения: 329
Благодарности: 3

Профиль | Отправить PM | Цитировать


shisik, описАлся, простите. 5й пустой. Ну да ладно, переберу массив в новый на 1 столбец больше.
Iska, рад вас видеть и в этой теме

Отправлено: 17:52, 25-05-2017 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Java - [решено] Чтение из текстового файла строковых данных в двумерный массив java8

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBS/WSH/JS - VBScript написать функции считывания таблицы данных из текстового файла evgenmsch@vk Скриптовые языки администрирования Windows 3 18-02-2014 07:20
CMD/BAT - Сборка текстового файла из содержимого другого текстового файла icomboy Скриптовые языки администрирования Windows 0 10-09-2013 15:17
CMD/BAT - [решено] Чтение содержимого текстового файла в переменную kosmopes Скриптовые языки администрирования Windows 2 11-03-2011 12:58
[решено] Чтение текстового файла с неизвестным именем ZeroCrash AutoIt 4 01-07-2009 19:03
Shell. Чтение текстового файла по строкам. Delphin911 Общий по Linux 11 07-04-2005 17:58




 
Переход