Разделение строк
Задача состоит в том, что есть файл где куча городов их регионы и т.д разделенные через множество пробелов. Пример из файла:
1 Адыгейск....Адыгея....Южный....12248....1973
2 Майкоп....Адыгея....Южный....144246....1857
3 Горно-Алтайск....Алтай....Сибирский....56928....1830
4 Алейск....Алтайский край....Сибирский....29512....1913
5 Барнаул....Алтайский край....Сибирский....612091....1730
6 Белокуриха....Алтайский край....Сибирский....14660....1803
Где "...." множество пробелов между именем, регионом и тд. У меня вопрос: как разделить эти эти объекты при помощи Scanner или других способов, чтобы я смог запихнуть к примеру: в регион не просто "Алтайский", а "Алтайский край"? Как я понял нужно учитывать, что когда один пробел scanner не должен его разделять на две составляющие. Пример программы которая считывает строки верно, но если встречается регион из двух составляющих, то он записывает вторую часть в след. переменную.
public static void main(String[] args) throws IOException {
Path pathToFile = Paths.get("/Users/oilbanana/Desktop/city_ru — копия.txt");
try (Scanner scanFile = new Scanner (pathToFile)) {
scanFile.useDelimiter(System.getProperty("line.separator"));
while (scanFile.hasNext()) {
cityArrayList.add(parseFileString(scanFile.nextLine()));
}
for (var city : cityArrayList) {
System.out.println(city);
}
}
catch (Exception e ){
System.out.println("Exception " + e);
}
public static City parseFileString (String str){
Scanner scanner = new Scanner(str);
int number = scanner.nextInt();
String name = scanner.next();
String region = scanner.next();
String district = scanner.next();
String population = scanner.next();
String foundation = scanner.next();
return new City(name,region,district,population,foundation); ```
Ответы (2 шт):
Вообще-то для разделения колонок лучше воспользоваться неким уникальным разделителем, например, тем же символом табуляции \t.
Но если это неприменимо к данной задаче и в существующем формате строки номер отделён одним пробелом, а остальные элементы в строке -- четырьмя, можно обработать эти случаи отдельно, и создать сканер уже для основных данных с использованием дополнительного разделителя:
String[] strs = {
"1 Адыгейск Адыгея Южный 12248 1973",
"2 Майкоп Адыгея Южный 144246 1857",
"5 Барнаул Алтайский край Сибирский 612091 1730"
};
for (String s : strs) {
int firstSpace = s.indexOf(' ');
int n = Integer.parseInt(s.substring(0, firstSpace));
Scanner read = new Scanner(s.substring(firstSpace + 1)).useDelimiter("[ ]{4}");
String city = read.next();
String region = read.next();
String district = read.next();
int population = read.nextInt();
int year = read.nextInt();
System.out.printf("%-10s | %-20s | %-10s | %,8d | %4d%n", city, region, district, population, year);
}
Вывод:
Адыгейск | Адыгея | Южный | 12,248 | 1973
Майкоп | Адыгея | Южный | 144,246 | 1857
Барнаул | Алтайский край | Сибирский | 612,091 | 1730
Все зависит от разделителя между словами в строке. Если разделителем между словами являются четыре точки (....) ,то разделять строку надо через 4 точки. Т.е ваш регион будет состоять из двух слов, с пробелом между ними.
List <String> regions=List.of([]); //массив строк регионов разделенных через символ новой строки (\n)
for (String region : regions) {
string=string.replace("....",","); //заменяем 4 точки на запятую
myRecord.set(string.split("\\p{Punct}")); //создаем обьект из массива слов
}