2015-12-09 2 views
0

Я получил этот текстовый файл, который мне нужно разобрать, и я ищу более эффективный способ сделать это.Чтение и разбор текстового файла с использованием Java

Файловая структура известна и выглядит следующим образом:

[section] 
key=value 
key=value 

[section] 
key=value 

[section] 
key=value 

У меня нет никакого способа знать заранее, сколько [раздел] Я буду читать, ни сколько ключа & значения есть в каждом разделе.

Я пытаюсь найти лучший способ сохранить этот файл в коллекции. До сих пор я полагал, что наилучшим использованием коллекции будет Map>, так что каждая [секция] будет привязана к связанному ключу.

Проблемы, которые я имею в основном для обработки пустых строк, как я ищу новые разделы с простым:

if(line.charAt(0) == '[') 

и, очевидно, с пустыми строками это возвращает нуль.

Может ли кто-нибудь просто дать мне хедз-ап на это?

+1

Вы могли бы, например, регулярное выражение соответствует линии, чтобы увидеть, если его а) новый раздел, б) заготовки, c) key = значение – Jan

+6

Почему бы просто не проверить длину линии? Если это '0', у вас есть пустая строка. – gonzo

+3

Не забудьте обрезать() свои строки перед проверкой их длины, если «пустые» строки могут содержать пробелы или вкладки. – StephaneM

ответ

0

Используйте HashMap для хранения пар значений ключа одной секции. И Hashmap для хранения раздела «Имя» с помощью хэш-карты ключевого значения. Затем прочитайте в строке и проверьте, является ли это новой секцией с регулярным выражением. Если это так, создайте новую запись с именем раздела и новым HashMap для пар ключей. Если не разделить строку на токен «=» и поместить в фактический раздел hashmap новую пару ключевых значений. Если никакое регулярное выражение не было найдено и разделение не приводит к двум частям, это не было ни новым разделом, ни ключевым значением, и строка будет уволена.

HashMap<String,HashMap<String,String>> sections = new HashMap<>(); 
BufferedReader br = new BufferedReader(new FileReader(new File(filename))); 
String line = ""; 
HashMap<String,String> actualSection = null; 
Pattern p = Pattern.compile("\\[(.*?)\\]"); // regex pattern for brackets 
while ((line = br.readLine()) != null) { 
    Matcher m = p.matcher(line); 
    if(m.find()){ 
     // found regex means new section 
     actualSection = new HashMap<String,String>(); 
     sections.put(m.group(1), actualSection); 
    } else{ 
     // read in new key Value pairs 
     String[] parts = line.split("="); 
     if(parts.length == 2 && actualSection != null){      
      actualSection.put(parts[0],parts[1]); 
     }      
    } 
} 

После этого вы все хранится в разделах переменной, и вы можете получить желаемое значение с

System.out.println(sections.get(SECTIONNAME).get(KEYNAME)); 
+0

Работает как шарм. У меня уже появилась идея HashMap из HashMap, но у меня были проблемы с пустыми строками в конце разделов. – aur8l

Смежные вопросы