java - 从文本导入数据

标签 java string text input

我有一堆文本文件,其中的条目如下所示:

20662 = {
    name="Durgulel"
    dynasty=100603
    martial=7
    diplomacy=4
    intrigue=5
    stewardship=4
    learning=6
    religion="orthodox"
    culture="alan"
    trait="chaste"
    trait="arbitrary"
    trait="scholarly_theologian"
    father=41592
    992.1.1={
        birth="992.1.1"
    }
    1068.1.1={
        death="1068.1.1"
    }
}

是否有一种标准方法可以将这样的值读取到变量中?

最佳答案

您可以使用 StreamTokenizer;应该看起来大致像这样(未经测试):

static Map<String,Object> parse(
     StreamTokenizer tokenizer, int endToken) throws IOException {
  Map<String,Object> result = new TreeMap<String,Object>();
  while (tokenizer.nextToken() != endToken) {
    String key = tokenizer.sval;
    if (tokenizer.nextToken() != '=') {
      throw new RuntimeException("'=' expected");
    }
    if (tokenizer.nextToken() == '{') {
      result.put(key, parse(tokenizer, '}'));
    } else {
      tokenizer.nextToken();
      result.put(key, tokenizer.sval);
    }
  }
  return result;
}

static void main(String[] args) throws IOException {
  Reader reader = new FileReader(args[0]);
  Map<String,Object> parsed = parse(
     new StreamTokenizer(reader), StreamTokenizer.TT_EOF);
  System.out.println(parsed);
}

附:这将需要对 922.1.1 和类似 key 进行一些额外的处理。如果格式确实只是基于行,那么使用 BufferedReader.readLine()、trim() 并检查 {/}/=

可能会更直接

p.p.s 如果变量指的是实例成员变量,则可以使用 Java 反射 API 来相应地设置它们(而不是像示例中那样读取映射)。您将提交要填充的对象,然后通过 object.getClass().getField(key).set(object, value) 查找并设置成员

关于java - 从文本导入数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19850008/

相关文章:

java - 传递给paint(Graphics)函数什么值? (AWT)

java - 如何读取包含文本和图像数据的文件?

java - 传输文件时出错 : Connection timed out: connect in maven.

java - 限制 java 只执行签名的 jar?

c++ - 标准模板字符串类 : string. fill()

java - 使用模式将字符串中的项目获取到数组中

string - 符合模式的整个单词的 Scala 字符串替换

string - 在惯用的 Swift 中找到两个字符串的公共(public)前缀

html - 事件页面不工作

java - 如何等待按钮内的加载程序完成加载?