Using delimiter when reading a file

本秂侑毒 提交于 2019-12-29 05:27:25

问题


I have little experience using delimiters and i need to read a text file that stores several objects whose data is stored in single lines separate by commas (","). The seperate strings are then used to create a new object which is added to an arraylist.

Amadeus,Drama,160 Mins.,1984,14.83
As Good As It Gets,Drama,139 Mins.,1998,11.3
Batman,Action,126 Mins.,1989,10.15
Billy Elliot,Drama,111 Mins.,2001,10.23
Blade Runner,Science Fiction,117 Mins.,1982,11.98
Shadowlands,Drama,133 Mins.,1993,9.89
Shrek,Animation,93 Mins,2001,15.99
Snatch,Action,103 Mins,2001,20.67
The Lord of the Rings,Fantasy,178 Mins,2001,25.87

I am using Scanner to read the file, however i get a no line found error and the entire file is stored into one string:

Scanner read = new Scanner (new File("datafile.txt"));
read.useDelimiter(",");
String title, category, runningTime, year, price;

while (read.hasNext())
{
   title = read.nextLine();
   category = read.nextLine();
   runningTime = read.nextLine();
   year = read.nextLine();
   price = read.nextLine();
   System.out.println(title + " " + category + " " + runningTime + " " +
                      year + " " + price + "\n"); // just for debugging
}
read.close();

回答1:


Use read.next() instead of read.nextLine()

   title = read.next();
   category = read.next();
   runningTime = read.next();
   year = read.next();
   price = read.next();



回答2:


I think you want to call .next() which returns a String instead of .nextLine(). Your .nextLine() call is moving past the current line.

Scanner read = new Scanner (new File("datafile.txt"));
   read.useDelimiter(",");
   String title, category, runningTime, year, price;

   while(read.hasNext())
   {
       title = read.next();
       category = read.next();
       runningTime = read.next();
       year = read.next();
       price = read.next();
     System.out.println(title + " " + category + " " + runningTime + " " + year + " " + price + "\n"); //just for debugging
   }
   read.close();



回答3:


You should be using next(); where you are using nextLine();

Have a look at the tutorial: http://docs.oracle.com/javase/tutorial/essential/io/scanning.html

Notice the lines:

try {
   s = new Scanner(new BufferedReader(new FileReader("xanadu.txt")));

   while (s.hasNext()) {
   System.out.println(s.next());
}



回答4:


You can also use a String.split() function to convert the string to an array of strings, then iterate over each of them for your values.

How to convert comma-separated String to ArrayList? see this for more details.




回答5:


One issue is:

while(read.hasNext())
   {
       title = read.nextLine();
       category = read.nextLine();
       runningTime = read.nextLine();

hasNext()

Returns true if this scanner has another token in its input. Not entire line. You need to use hasNextLine()

You are doing nextLine() three times. I think what you need to do is, read the line and the split the line.




回答6:


All of the answers above are right and actually the same. However, one important point everybody should remember that the Scanner has a buffer size of only 1024. That means if the length of the delimited text is more, the parsing will stop.

So, a little enhancement to the given solution, use BufferedReader instead of directly passing the file to the Scanner. Example:

    BufferedReader in = new BufferedReader(new FileReader("datafile.txt"), 16*1024);
    Scanner read = new Scanner(in);
    read.useDelimiter(",");
    String title, category, runningTime, year, price;

    while(read.hasNext())
    {
        title = read.next();
        category = read.next();
        runningTime = read.next();
        year = read.next();
        price = read.next();
        System.out.println(title + " " + category + " " + runningTime + " " + year + " " + price + "\n"); //just for debugging
    }
    read.close();


来源:https://stackoverflow.com/questions/14242984/using-delimiter-when-reading-a-file

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!