3

次の形式で記述されたテキスト ファイルを読み込もうとしています。

    AB523:[joe, pierre][charlie][dogs,cat]
    ZZ883:[ronald, zigomarre][pele]

構造を作成し、情報を適切に取得したいと思います。

AB523 --- 一人
ジョー、ピエール --- 一人
チャーリー --- 一人
犬、猫 --- 一人

使用する必要がある最良のテクニックは何かわかりません。私は StringTokenizer を試しました ...そして regEx で遊んだが、うまくいかない

解決策はありますか?または提案

テキストファイルに書き込むときの規則は何ですか? 区切り記号を使用する最善の方法は何ですか?

EDIT:テキストファイルも私が生成したものなので、パターン全体を制御できます。読み直す際の作業量を減らすには、どのような出力パターンが最適でしょうか?

4

5 に答える 5

2

ここでは正規表現を使用します。これは、維持するコードが少ないように思われ、言語が確実に規則的であるためです。java.util.Scannerより効率的なインスタンスと一緒に。ここにいくつかのコードがあります:

import java.io.Reader;
import java.io.StringReader;
import java.util.Scanner;
import java.util.regex.Pattern;

public class ScannerTest {

private static final Pattern header = Pattern.compile("(.*):");
private static final Pattern names = Pattern.compile("\\[([^\\]]+)\\]");

public static void main(String[] args) {

    Reader reader = new StringReader(
            "AB523:[joe, pierre][charlie][dogs,cat]\n"
                    + "ZZ883:[ronald, zigomarre][pele]");

    Scanner scanner = new Scanner(reader);
    scanner.useDelimiter("\n");

    while (scanner.hasNext()) {
        String h = scanner.findInLine(header);
        // Substring removes trailing ':'.
        System.out.println(h.substring(0, h.length() - 1));

        String n;
        while ((n = scanner.findInLine(names)) != null)
            // Substring removes '[' and ']'.
            System.out.println(n.substring(1, n.length() - 1));

        if (scanner.hasNext())
            scanner.nextLine();
    }
}
}

それにもかかわらず、部分文字列の呼び出しを削除することはまだできませんでした。私の推測では、文字列の不変性のため、この場合に文字列を再作成するべきではありません。

編集:パフォーマンスを向上させるために、手作りの再帰降下パーサーも検討します。

于 2011-11-01T04:50:30.747 に答える
1

使用String#splitまたはPattern#split方法。例えば、

   String[] list ="AB523:[joe, pierre][charlie][dogs,cat]".split("[:\\[\\]]+");
   for(String s : list)
       System.out.println(s);
于 2011-11-01T06:00:58.473 に答える
0

ファイル形式を制御できるので、タブ区切りをお勧めします。他の多くのプログラム(Excelなど)は、タブ区切りで読み取ります。したがって、ファイルは次のようになります(\ tはタブを表します)

AB523\tjoe, pierre\tcharlie\tdogs,cat
ZZ883\tronald, zigomarre\tpele

注-コンマは文字列の有効な値であるため、別の一般的な形式であるコンマ区切り(CSV)を使用することはできません。同様に、タブ文字が文字列内の有効な文字である場合、タブ区切りには問題があります。

他の人が示唆しているように、String.split()はファイルを解析するための良い方法です。

于 2011-11-01T05:51:32.090 に答える
0

1 文字の区切り記号は簡単に分割できます。String.split() 関数は、文字または文字列で分割します。それらは StringTokenizer が行うこととまったく同じことを行いますが、よりクリーンな構文で行います。つまり、String[] items = myString.split(",")よりもはるかにきれいに見えます

StringTokenizer st = new StringTokenizer(myString, ","); 
while(st.hasMoreTokens()){
    myList.add(st.nextToken();
}

split将来の使用は私が言っていることです。)

ただし、少し複雑な状況にあるようです。左[と右に接するものを取得する必要があります]。これには、正規表現とキャプチャ グループが必要です。何かのようなもの/\[(.*)\]/

CSV (コンマ区切り値) は単純な表形式のデータとして一般的であり、形式もある程度標準化されています。より複雑なオブジェクトを表現したい場合は、JSON または SOAP を使用できます。Java 用のストレージのみを使用している場合は、Java の組み込みのシリアル化機能を調べてください。

ローカルで使用していて、おそらくそれを表すためにある種の Java オブジェクトを保存しているので、1 つの方法はSerializable、データを表すオブジェクトに実装することです。

それが気に入らない場合は、ある種のツリー構造を行っているように見えるので、JSON を使用します。

于 2011-11-01T03:50:43.650 に答える
0

データ ファイルを生成する場合は、CSV (単純な線形データの場合)、Json (構造化データの場合)、さらには XML (構造化データの重い処理の場合) などの標準的なファームマットで生成します。

于 2011-11-01T06:59:49.410 に答える