public static void readFromFile(KoohiiReader kr, String file) {
    try (CSVReader reader = new CSVReader(new FileReader(file))) {
      String[] fields;
      while ((fields = reader.readNext()) != null) {
        if (fields.length <= 1) continue;
        if (fields.length != 6) {
          System.out.println(
              "Warning: wrong number of elements in line " + Arrays.toString(fields));
          continue;
        }

        KoohiiEntry ke = new KoohiiEntry();
        ke.index = fields[0];
        ke.character = fields[1];
        ke.keyword = fields[2];
        ke.story = fields[5];
        kr.parseStory(ke);
        kr.add(ke);
      }

    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  private void parseStory(KoohiiEntry ke) {
    StringBuilder story = new StringBuilder();

    Matcher m = p.matcher(ke.story);
    int lastpos = 0;
    while (m.find()) {
      story.append(ke.story.substring(lastpos, m.start()));
      switch (m.group(1)) {
        case "thanks":
          break;
        case "primitive":
          String arg = m.group(2);
          int splitpos = arg.indexOf(':');
          if (splitpos < 0) {
            ke.primitive = arg;
          } else {
            KoohiiEntry primitive = new KoohiiEntry();
            String firstPart = arg.substring(0, splitpos).trim();
            primitive.story = arg.substring(splitpos + 1).trim();

            splitpos = firstPart.indexOf("|");
            if (splitpos < 0) {
              primitive.primitive = firstPart;
              primitive.character = firstPart;
              primitive.index = primitive.character;
            } else {
              primitive.primitive = firstPart.substring(splitpos + 1).trim();
              primitive.character = firstPart.substring(0, splitpos).trim();
              primitive.index = primitive.primitive;
            }
            add(primitive);
          }

          break;
        default:
          // System.out.println(m.group(0));
      }
      lastpos = m.end();
    }
    story.append(ke.story.substring(lastpos));

    ke.story = story.toString().trim();
  }