Как токенизировать входной файл в Java - PullRequest
1 голос
/ 24 июля 2011

Я делаю токенизацию текстового файла в Java.Я хочу прочитать входной файл, токенизировать его и записать определенный символ, который был токенизирован в выходной файл.Это то, что я сделал до сих пор:

 
package org.apache.lucene.analysis;</p>

<p>import java.io.*; </p>

<p>class StringProcessing
    {
    // Create BufferedReader class instance
    public static void main(String[] args) throws IOException
        {
        InputStreamReader input = new InputStreamReader(System.in);
        BufferedReader    keyboardInput = new BufferedReader(input);
        System.out.print("Please enter a java file name: ");
        String filename = keyboardInput.readLine();
        if(!filename.endsWith(".DAT"))
        {
        System.out.println("This is not a DAT file.");
        System.exit(0);
        }
        File File = new File(filename);
        if(File.exists())
        {
        FileReader file = new FileReader(filename);
        StreamTokenizer streamTokenizer = new StreamTokenizer(file);
        int i=0;
        int numberOfTokensGenerated = 0;
            while(i != StreamTokenizer.TT_EOF)
            {
            i = streamTokenizer.nextToken();
            numberOfTokensGenerated++;
            }
         // Output number of characters in the line
            System.out.println("Number of tokens = " + numberOfTokensGenerated);
         // Output tokens
            for (int counter=0; counter < numberOfTokensGenerated; counter++) 
            {
                char character = file.toString().charAt(counter);
                if (character == ' ') System.out.println();<br>
                else System.out.print(character);
            }
            }
        else
        {
        System.out.println("File does not exist!");
        System.exit(0);
        }</p>

<code>System.out.println("\n");    
    }//end main
   }//end class <code>
</code>

Когда я запускаю этот код, это то, что я получаю:

Please enter a java file name: D://eclipse-java-helios-SR1-win32/LexractData.DAT Number of tokens = 129 java.io.FileReader@19821fException in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 25 at java.lang.String.charAt(Unknown Source) at org.apache.lucene.analysis.StringProcessing.main(StringProcessing.java:40)

Входной файл будет выглядеть следующим образом:

`-K1 Account

- Снять вывод Op1

--- Param1 и

---- Тип Int

--- сумма Param2

---- тип Int

- депозит Op2

--- Param1 и

---- Тип Int

--- Param2 Сумма

---- Тип Int

- CA1 acNo

--- Тип Int

-K2 CheckAccount

- учетная запись SC

- CA1 credit_limit

--- Тип Int

-K3 Клиент

- имя CA1

--- тип строка

-K4 транзакция

- дата CA1

--- тип дата

- CA2 time

--- Тип Time

-K5 CheckBook

-K6 Check

-K7 BalanceAccount

- Учетная запись SC`

Я просто хочу прочитать строку, начинающуюся с -K1, -K2, -K3,и так далее ... кто-нибудь может мне помочь?

Ответы [ 2 ]

2 голосов
/ 24 июля 2011

Проблема с этой строкой -

char character = file.toString().charAt(counter);

file - это ссылка на FileReader, которая не реализует toString() .. она вызывает Object.toString () , которая печатает ссылку длиной около 25 символов. Вот почему ваше исключение говорит OutofBoundsException на 26-м символе.

Чтобы правильно прочитать файл, вам следует обернуть ваш файловый ридер буферизованным и затем поместить каждую строку чтения в буфер строк.

FileReader fr = new FileReader(filename);
BufferedReader br = new BufferedReader(fr);
StringBuilder sb  = new StringBuilder();
String s;
while((s = br.readLine()) != null) {
sb.append(s);
} 

// Now use sb.toString() instead of file.toString()

1 голос
/ 26 июня 2015

Если вы хотите токенизировать входной файл, тогда очевидный выбор - использовать сканер.Класс Scanner читает заданный входной поток и может выводить токены или другие типы сканирования (scanner.nextInt (), scanner.nextLine () и т. Д.).

import java.util.Scanner;
import java.io.File;
import java.io.IOException;
public static void main(String[] args) throws IOException {
    Scanner in = new Scanner(new File("filename.dat"));
    while (in.hasNext) {
        String s = in.next(); //get the next token in the file
        // Now s contains a token from the file
    }
}

Извлечение Документация Oracleкласса сканера для получения дополнительной информации.

...