1

データを含むテキスト ファイルがあります。ファイルにはすべての月の情報が含まれています。1 月の情報が 50 行を占めているとします。2 月が始まり、さらに 40 行を占有します。3 月などがあるより... ファイルの一部だけを読み取ることはできますか? 「X 行目から Y 行目まで読んでください」と言えますか? またはこれを達成するためのより良い方法はありますか?全ファイルではなく、1ヶ月分のデータのみを印刷したい。これが私のコードです

public static void readFile()
{
  try
  {
     DataInputStream inputStream = 
     new DataInputStream(new FileInputStream("SpreadsheetDatabase2013.txt"));

   while(inputStream.available() != 0)
   {
     System.out.println("AVAILABLE: " + inputStream.available());
     System.out.println(inputStream.readUTF());
     System.out.println(inputStream.readInt());
     for (int i = 0; i < 40; i++)
     {
       System.out.println(inputStream.readUTF());
       System.out.println(inputStream.readUTF());
       System.out.println(inputStream.readUTF());
       System.out.println(inputStream.readUTF());
       System.out.println(inputStream.readUTF());
       System.out.println(inputStream.readDouble());
       System.out.println(inputStream.readUTF());
       System.out.println(inputStream.readBoolean());
       System.out.println();
     }
   }// end while
   inputStream.close();
 }// end try
 catch (Exception e)
 {
   System.out.println("An error has occurred.");
 }//end catch
}//end method

お時間をいただきありがとうございます。

4

4 に答える 4

0

これに対する私のアプローチは、テキストファイルの内容全体を読み取り、それをArrayListに格納し、要求された月の行のみを読み取ることです。

例:

この関数を使用して、ファイルからすべての行を読み取ります。

/**
 * Read from a file specified by the filePath.
 * 
 * @param filePath
 *            The path of the file.
 * @return List of lines in the file.
 * @throws IOException
 */

public static ArrayList<String> readFromFile(String filePath)
        throws IOException {
    ArrayList<String> temp = new ArrayList<String>();
    File file = new File(filePath);
    if (file.exists()) {
        BufferedReader brin;
        brin = new BufferedReader(new FileReader(filePath));
        String line = brin.readLine();
        while (line != null) {
            if (!line.equals(""))
                temp.add(line);
            line = brin.readLine();
        }
        brin.close();
    }
    return temp;
}

次に、必要なものだけをArrayListtempから読み取ります

例:

50行のデータを想定して2月のデータを読み取り、40行目から開始する場合。

for(int i=40;i<90;i++)
{
    System.out.println(temp.get(i));
}

注:これは、これを行う1つの方法にすぎません。他に方法があるかどうかはわかりません!

于 2013-01-03T17:35:53.840 に答える
0

スキャナークラスを使用します。

Scanner scanner = new Scanner(filename);

ファイルの各行を取得するために使用scanner.nextLine()します。行xから行yだけが必要な場合は、forループを使用して、必要な行をスキャナーで確認する前に、不要な各行をスキャンできます。ただし、例外をスローせずに例外をヒットしないように注意してください。

または、スキャナーを調べて、各行について、その行の文字列の内容をArrayListに追加することもできます。幸運を。

于 2013-01-03T17:51:09.550 に答える
0

Java 7 を使用している場合は、Files.readAllLines(Path path, Charset cs)を使用できます。

Path path = // Path to "SpreadsheetDatabase2013.txt"
Charset charset = // "UTF-8" or whatever charset is used
List<String> allLines = Files.readAllLines(path, charset);
List<String> relevantLines = allLines.subList(x, y);

x(inclusive) とy(exclusive) は対象となる行番号を示します。 List.subList(int fromIndex, int toIndex) を参照し てください

の JavaDoc に記載されているように、このソリューションの利点の 1 つreadAllLines():

このメソッドは、すべてのバイトが読み取られるか、I/O エラーまたはその他の実行時例外がスローされたときに、ファイルが閉じられることを保証します。

于 2013-01-03T17:48:26.850 に答える
0

データの整理方法に基づいて、次のようなことをお勧めします

ArrayList<String> temp = new ArrayList<String>();
int read = 0;
File file = new File(filePath);
if (file.exists()) {
    BufferedReader brin;
    brin = new BufferedReader(new FileReader(filePath));
    String line = brin.readLine();
    while (line != null) {
        if (!line.equals("")){
            if(line.equals("March"))
                read = 1;
            else if(line.equals("April"))
                break;
            else if(read == 1)
                temp.add(line);
        }
        line = brin.readLine();
    }
    brin.close();

自分で試してみたところ、3 月から 4 月までのすべてのデータが取り込まれます。必要に応じて調整したり、変数にすることができます。基盤コードを提供してくれた ngoa に感謝します。クレジットが必要な場合のクレジット

于 2013-01-03T17:48:47.873 に答える