0

大量の個人/家族の記録を含む入力 GEDCOM ファイルがあります。目的は、データを次の形式にフォーマットすることです。

名前(p6、「ハリー・ブイス」)。生年月日(p6、日付(1927,11,17))。死(p6、日付(2001,08,21))。famc(p6、f3)。fams(p6、f2)。

個人番号と名前を引き出して出力ファイルに出力することはできましたが、生年月日と死亡日の解析に問題があります。出力ファイルに出力できるように、substring を使用して、birthDay、birthMonth、および BirthYear を整数として割り当てられるようにしたいと考えています。日付でソートできるように、整数でなければなりません。以下は、入力ファイルからの 1 つのクライアントのデータのサンプルです。

0 @P6@ INDI 
1 BIRT 
2 DATE 17 Nov 1924
1 NAME Harry /Buis/
1 DEAT Age: 76
2 DATE 21 Aug 2001
1 SEX M
1 FAMC @F3@
1 FAMS @F2@

そして、ここに私がこれまでに持っているもののソースコードがあります:

public class Main {

static Scanner scan;
static BufferedWriter outFile;
static int birthYear = 0;
static int birthMonth = 0;
static String birthDay = "";
static int deathYear = 0;
static int deathMonth = 0;
static int deathDay = 0;
static String name = "";
static String person = "";
static String sex = "";
static String famC = "";
static String famS = "";
static String man = "";
static String woman = "";
static String child = "";

public static void parse() throws IOException {
    scan = new Scanner(new FileReader("pbuis.ged"));
    outFile = new BufferedWriter(new FileWriter("output.txt"));
    String reader = scan.nextLine();
    int count = 0;

    while (scan.hasNextLine()) {

        if (reader.contains("NAME") && count < 1) {
            reader = reader.substring(1).replace("/", "");
            count++;
            System.out.println(reader);
            name = reader.replace("NAME", "");
        }

        if (reader.startsWith("0")) {
            person = reader.trim().substring(2, 7).replace("@", "")
                    .replace("I", "").trim().toLowerCase();
            System.out.print(person);
            count = 0;
        }

        if (reader.contains("BIRT")) {
            scan.nextLine();
            birthDay = Integerreader.substring(6, 9).trim();
        }

        if (reader.equalsIgnoreCase("") || reader.equalsIgnoreCase(" ")) {
            outFile.write("name(" + person + ", " + "'" + name.trim() + "'"
                    + ")." + "\n" + birthDay);

        }

        reader = scan.nextLine();
    }
}

public static void main(String[] args) throws IOException {
    parse();

}

}

if ステートメント (「BIRT」を含む) がなく、outFile.write() メソッドに「birthDay」がない場合、出力は次のようになります。

name(p1, 'Paul Edward Buis').
name(p2, 'Thomas Edward Buis').
name(p3, 'Jennifer Joy Buis').
name(p4, 'Daniel Paul Buis').
name(p5, 'Barbara Joy VanderWall').
name(p6, 'Harry Buis').

これは良いスタートです。

しかし、そのifステートメントがあると、次のようなエラーが発生し、何も出力されません:

p1Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 9
    at java.lang.String.substring(Unknown Source)
    at Main.parse(Main.java:50)
    at Main.main(Main.java:64)

今、部分文字列インデックス値のすべての組み合わせを試しましたが、何もうまくいかないようです。これを修正する方法について何か考えはありますか?

前もって感謝します。

4

2 に答える 2

0

日付関数を使用することをお勧めします。日付関数は、年/月/日よりも簡単に並べ替えることができます。本当に必要な場合は、エポックからのミリ秒として保存してください。

日付を解析するには、SimpleDateFormatterを使用します。私はこのようなものがうまくいくと信じています:

SimpleDateFormatter dateFormat=new SimpleDateFormat("dd mmm yyyy")
Date birth=date.parse("17 jul 1984",0);

日付形式に変換すると、次のような多くの優れた処理を実行できます。

Date date1, date2;
date1.after(date2);
date1.compareTo(date2)

分や秒を取得することもできますが、お勧めしません。0 は文字列を開始するインデックスを参照することに注意してください。そのため、フォーマットが開始するインデックスを指定するだけで問題ありません。全体的に、これはずっときれいだと思います。

于 2014-11-13T23:29:33.437 に答える
0

GEDCOM ファイルからの日付の解析には注意が必要です。dd MMM yyyy 形式 (2015 年 9 月 26 日など) の任意の日付に SimpleDateFormatter を使用できますが、GEDCOM は、月と年しかない、または年だけの不正確な日付など、多くの奇妙なバリエーションをサポートしています。また、「ABT」のようなプレフィックスを使用して、特定の日付の前後に何かが発生したことを示したり、範囲 (「BET date1 AND date2」) および (「FROM date1 TO date2」) を許可したり、その他の多くの複雑な動作 (フランス共和党またはヘブライ暦、誰か?)

gedcom4j ( http://gedcom4j.org ) を使用することをお勧めします。これは、プログラムにリンクしてデータを Java オブジェクトにロードし、必要なことを実行できる Java ライブラリです。そのライブラリの DateParser クラスは、文字列値を解釈して java.util.Date 値に変換できるため、説明したことを実行できます。

于 2016-07-23T13:07:19.120 に答える