【问题标题】:Reading and parsing a text file using Java [duplicate]使用Java读取和解析文本文件[重复]
【发布时间】:2016-03-14 22:33:31
【问题描述】:

我得到了需要解析的文本文件,我正在寻找更有效的方法。

文件结构是已知的,如下所示:

[section]
key=value
key=value

[section]
key=value

[section]
key=value

我无法提前知道我将阅读多少 [section],也不知道每个部分有多少 key & value。

我正在尝试找到将此文件存储在集合中的最佳方式。到目前为止,我认为最好使用的集合是 Map>,这样每个 [section] 都会附加其关联的键值。

我遇到的问题主要是处理空行,因为我正在寻找一个简单的新部分:

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

显然,使用空行返回 null。

谁能告诉我这个问题?

【问题讨论】:

  • 您可以例如正则表达式匹配该行以查看它是否 a) 新部分,b) 空白,c) key= value
  • 为什么不只检查行的长度?如果是0,则为空行。
  • 如果“空”行可以包含空格或制表符,请不要忘记在检查字符串长度之前修剪()字符串
  • 您正在阅读 Java Properties 文件。

标签: java


【解决方案1】:

使用HashMap来存储一个section的键值对。以及一个 Hashmap,用于存储带有 Key Value Hashmap 的部分名称。 然后在线阅读并检查它是否是带有正则表达式的新部分。如果是这样,则为 Key Value 对创建一个带有部分 Name 和新 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]);   
        }                       
    }
}

之后,您将所有内容都存储在 section 变量中,您可以通过

获得所需的值
System.out.println(sections.get(SECTIONNAME).get(KEYNAME));

【讨论】:

  • 像魅力一样工作。我已经得到了 HashMap 想法的 HashMap 工作,但是在处理部分末尾的空白行时遇到了麻烦。
猜你喜欢
  • 2017-07-04
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
  • 2014-12-05
相关资源
最近更新 更多