|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Java - [решено] Чтение из текстового файла строковых данных в двумерный массив java8 |
|
Java - [решено] Чтение из текстового файла строковых данных в двумерный массив java8
|
Старожил Сообщения: 329 |
Профиль | Отправить PM | Цитировать Собственно как это сделать?
Scanner использовать или reader или что? Использовать List<List<Double>> matr = new LinkedList<>(); для подсчёта строк в файле? Сильно не пинайте, но только начинаю изучать. Выручайте, ребята. Как вариант считать в одномерный, а потом переделать в двумерный массив с использованием регулярки |
|
Отправлено: 15:05, 23-05-2017 |
Старожил Сообщения: 329
|
Профиль | Отправить PM | Цитировать |
Отправлено: 11:59, 25-05-2017 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 329
|
Профиль | Отправить 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 |
Ветеран Сообщения: 3247
|
Профиль | Отправить 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 |
Старожил Сообщения: 329
|
Профиль | Отправить PM | Цитировать shisik, почему не годится?
И такой метод не разбивает - все в одну строку пишет. |
Последний раз редактировалось blackeangel, 25-05-2017 в 15:34. Отправлено: 15:06, 25-05-2017 | #14 |
Ветеран Сообщения: 3247
|
Профиль | Отправить PM | Цитировать Потому что в методе split регулярка задаёт шаблон разделителя, а не всей разделяемой строки. Пока в строке после имени файла ожидались лишь цифры и пробелы, можно было проделать трюк с проверкой на наличие таких символов после пробела и таким образом не считать разделителем пробелы внутри имени файла. Если после этого пробела есть символы, не удовлетворяющие условию, например, буквы. Именно это делает часть
до конца строки не должно быть ничего кроме максимум трёх чисел, разделённых пробелами. К слову, примерно то же самое можно написать проще, но всё равно не спасает: Можно пытаться дальше развивать этот шаблон, но в конечном итоге в имени файла может встретиться числа, окруженное пробелами, например File 123 name.txt - и всё, в любом случае это число будет выделено в отдельный элемент массива, а не будет частью имени файла, как должно быть. Так что этот путь тупиковый, в смысле использование split. А вот написать регулярку, соответствующую всей строке целиком - это возможно и совсем несложно. Что и сделал. Но только тогда split уже не годится. |
Отправлено: 15:45, 25-05-2017 | #15 |
Старожил Сообщения: 329
|
Профиль | Отправить PM | Цитировать Вот файл в котором есть варианты разновидностей.
В массиве надо получить следующее: Столбец0: путь к файлу и имя файла Столбец1-столбец3: права(0 0 0764) Столбец4: пустой и заполненный в зависимости от наличия заполнителя Столбец5:пустой |
Последний раз редактировалось blackeangel, 30-05-2017 в 20:39. Отправлено: 15:57, 25-05-2017 | #16 |
Старожил Сообщения: 329
|
Профиль | Отправить PM | Цитировать shisik, то есть надо использовать 2 массива:в один читаем файл, во второй этот массив раскладывается по столбцам при помощи регулярки?
|
Отправлено: 16:00, 25-05-2017 | #17 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата blackeangel:
|
|
Отправлено: 16:40, 25-05-2017 | #18 |
Ветеран Сообщения: 3247
|
Профиль | Отправить PM | Цитировать Цитата blackeangel:
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: права 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 |
Старожил Сообщения: 329
|
Профиль | Отправить PM | Цитировать shisik, описАлся, простите. 5й пустой. Ну да ладно, переберу массив в новый на 1 столбец больше.
Iska, рад вас видеть и в этой теме |
Отправлено: 17:52, 25-05-2017 | #20 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|