-3

このようなテキストファイルがあります。

12A aa65 3244 5 665 fr 65 3434344344343 888dds 77786334 6h
1114 22 6FF 7 d M6 h o8 665466676 8Pt 543NNv 9

ファイルはさまざまな幅の列になっています。たとえば、最初の列は 6 文字幅、2 番目の列は 5 文字、3 番目の列は 5 文字などです。

最初の行のように、各行を列の値に分割したい:

12A 、 aa65 、 3244 、 5 、 、 665 、 fr 、 65 、 3434344344343 、 888dds 、 77786334 、 6h
4

5 に答える 5

4

更新された回答:

ああ、よし、テキストを列の幅で分割したい。列の長さは次のようになります。

6
5
5
6
8
6
4
18
9
(残り)

したがって、行を読んでから、それらの個々の部分を取得するために使用し、おそらくBufferedReader#readLine空白を削除するために使用します。String#substringString#trim

BufferedReader r = /*...get a BufferedReader for your input...*/;
String line;
String[] parts;
int[] columns = new int[]{ // The starting index of each column
    6,
    5+6,
    5+5+6,
    6+5+5+6,
    8+6+5+5+6,
    6+8+6+5+5+6,
    4+6+8+6+5+5+6,
    18+4+6+8+6+5+5+6,
    9+18+4+6+8+6+5+5+6
};
int i;
int start, end;
int linelen;

// Read each line
while ((line = r.readLine()) != null) {
    // Get its length
    linelen = line.length();

    // Get an array for the result
    parts = new string[columns.length];

    // Loop through our column starting indexes
    for (i = 0; i < columns.length; ++i ) {
        // Get the start and end indexes for this column
        start = columns[i];
        end = i < columns.length - 1 ? columns[i+1] : linelen;

        // Is the string long enough?
        if (linelen < start) {
            // No, use null
            parts[i] = null;
        }
        else {
            // Yes, grab the text
            parts[i] = line.substring(start, end > linelen ? linelen : end);

            // Note - you may want `.trim()` on the end of the above, if you
            // don't want trailing spaces (or leading spaces, but none of your
            // examples has leading spaces).
        }
    }

    // **Use the `parts` of this line.
}

の配列ではなくクラスを使用し、partsその解析ロジックをクラス内に配置することも検討してください。


元の答え:

との組み合わせを探しているようです:BufferedReader#readLineString#split

BufferedReader r = /*...get a BufferedReader for your input...*/;
String line;
String[] parts;

while ((line = r.readLine()) != null) {
    parts = line.split(" +");
    // Use the `parts` array
}

readLine入力から行を読み取ります。

split正規表現で定義された区切り文字を使用して、文字列を文字列配列に分割します。あなたの場合、区切り文字は 1 つ以上のスペースにすぎないようです。

于 2013-08-11T09:00:54.400 に答える
4

Scanner を使用してファイルを読み取り、subString(start, end) メソッドを使用して各フィールドを解析します。

Scanner sc = new Scanner(new File("myFile"));
while (sc.hasNextLine()) {
   String aLine = sc.nextLine();
   String field1 = aLine.subString(0,6);
   String field2 = aLine.subString(6,11);
   ...
}
于 2013-08-11T09:09:21.587 に答える
1

readline()スペースごとに使用できますsplit

于 2013-08-11T09:00:57.740 に答える
1

ここのように文字列を分割したいとします。

ファイルを読んで、それを分割したいだけだと思います。

Str.split("\n")行とスペースに使用しStr.split(" ")ます (必要な場合)

于 2013-08-11T09:01:52.317 に答える
1

Java のリーダーのいくつかの形式には、.ReadLine() メソッドがあります。これにより、改行文字が検出されるまでソースから入力が読み取られます。

ファイルの読み取りには、通常、FileReader のラッパーとして BufferedReader を使用します。これは、一括読み取りの方が効率的であるためです。(FileReaders は、読み取りメソッドへの呼び出しごとにファイルから読み取ります。)

編集して追加: 結果を並べ替えたい場合は、ランダム ディスク アクセスが非常に遅いため、データを完全にメモリに読み込んでから並べ替える方がはるかに効率的です。

カスタムコンパレータを使用して、リストまたは優先キューに行を読み込むと、目的が達成されます。

于 2013-08-11T09:04:28.920 に答える