Читать многострочный текст со значениями, разделенными пробелами - PullRequest
4 голосов
/ 24 октября 2010

У меня есть следующий тестовый файл:

Jon Smith 1980-01-01
Matt Walker 1990-05-12

Как лучше всего анализировать каждую строку этого файла, создавая объект с (имя, фамилия, дата рождения)? Конечно, это всего лишь пример, в реальном файле много записей.

Ответы [ 5 ]

9 голосов
/ 24 октября 2010
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class ScannerReadFile {
    public static void main(String[] args) {
        //
        // Create an instance of File for data.txt file.
        //
        File file = new File("tsetfile.txt");

        try {
            //
            // Create a new Scanner object which will read the data from the 
            // file passed in. To check if there are more line to read from it
            // we check by calling the scanner.hasNextLine() method. We then
            // read line one by one till all line is read.
            //
            Scanner scanner = new Scanner(file);
            while (scanner.hasNextLine()) {
                String line = scanner.nextLine();
                System.out.println(line);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

    }
}

Это:

            while (scanner.hasNextLine()) {
                String line = scanner.nextLine();

Можно также изменить на

        while (scanner.hasNext()) {
            String line = scanner.next();

Который будет читать пробелы.

Вы могли бы сделать

Scanner scanner = new Scanner(file).useDelimiter(",");

Для создания пользовательского разделителя

На момент публикации у вас было три разных способа сделать это. Здесь вам просто нужно проанализировать данные, которые вам нужны. Вы можете прочитать строку, затем разделить или прочитать одну за другой, и все будет 3 новой строкой или новым человеком.

9 голосов
/ 24 октября 2010
 import java.io.*;
 class Record
{
   String first;
   String last;
   String date;

  public Record(String first, String last, String date){
       this.first = first;
       this.last = last;
       this.date = date;
  }

  public static void main(String args[]){
   try{
    FileInputStream fstream = new FileInputStream("textfile.txt");
          DataInputStream in = new DataInputStream(fstream);
          BufferedReader br = new BufferedReader(new InputStreamReader(in));
          String strLine;
          while ((strLine = br.readLine()) != null)   {
   String[] tokens = str.split(" ");
   Record record = new Record(tokens[0],tokens[1],tokens[2]);//process record , etc

   }
   in.close();
   }catch (Exception e){
     System.err.println("Error: " + e.getMessage());
   }
 }
}
1 голос
/ 24 октября 2010

Используйте FileReader для чтения символов из файла, используйте BufferedReader для буферизации этих символов, чтобы вы могли читать их как строки.Тогда у вас есть выбор. Лично я бы использовал String.split () , чтобы разбить пробел, давая вам хороший String Array, вы также можете маркировать эту строку.

Конечно, вам нужно подумать о том, что произойдет, если у кого-то будет отчество и тому подобное.

1 голос
/ 24 октября 2010

На первый взгляд, я бы предположил, что StringTokenizer будет вашим другом здесь, но, имея некоторый опыт в реальной работе в бизнес-приложениях, вы, вероятно, не можете гарантировать, что Фамилия - это одно имя (т.е. кто-то с двойным фамилия в бочонке, без переноса вызовет у вас проблемы.

Если вы можете гарантировать целостность данных, ваш код будет

BufferedReader read = new BufferedReader(new FileReader("yourfile.txt"));
String line = null;
while( (line = read.readLine()) != null) {
   StringTokenizer tokens = new StringTokenizer(line);
   String firstname = tokens.nextToken();
   ...etc etc
}

Если вы не можете гарантировать целостность ваших данных, то вам нужно будет найти первый пробел и выбрать все символы перед этим в качестве фамилии, найти последний пробел и все символы после него в качестве DOB, и все, что между ними это фамилия.

0 голосов
/ 24 октября 2010

Посмотрите на BufferedReader класс.У него есть метод readLine.Затем вы можете разделить каждую строку пробелами, чтобы получить каждое отдельное поле.

...