[英]bufferedreader won't move to the next line
晚上好,
我需要从文件中读取一些行,文件为csv,文件的结构如下:
4,
Mo Farah,30,
Jessica Ennis,27,
我需要读取这些值并将其放入变量中,这就是我尝试执行的操作:
while(nextline != null){
StringTokenizer st = new StringTokenizer(nextline,",");
int size = Integer.parseInt(st.nextToken());
System.out.println(size);
nextline = reader.readLine();
StringTokenizer st2 = new StringTokenizer(nextline, ","); //why???
String name = st2.nextToken();
System.out.println(name);
int age = Integer.parseInt(st2.nextToken());
System.out.println(age);
第一个int(4)读得很好,但是,如果我想移至下一行,它会引发noSuchElementException,因此我必须在“ // why ???”旁边写一行 为了移至下一行,我真的要在每次要移至下一行时实例化一个新的令牌生成器吗? 还是有更好的方法呢?
非常感谢你
nextline = reader.readLine(); // I'm assuming you have this here
while(nextline != null){
下面将分析行"4,"
并将其拆分为由分隔的令牌,
它将包含1个令牌: "4"
:
StringTokenizer st = new StringTokenizer(nextline,",");
以下将成功执行,但是您确实应该在执行此操作之前检查st.hasMoreTokens()
返回true。 它将使用st
的令牌"4"
,该令牌现在不再包含令牌:
int size = Integer.parseInt(st.nextToken());
System.out.println(size);
// We read the next line into "nextline", this is okay but not pretty.
// Also you need to check that nextline is not `null` here.
nextline = reader.readLine();
StringTokenizer st2 = new StringTokenizer(nextline, ","); //why???
因为使st
解析了行"4,"
。 在解析该行之后分配nextline
不会更新st
的内部状态(无法实现)。 这样根本行不通。 因此,如果您在此处调用st.nextToken()
,则将获得如您所说的NoSuchElementException
。 因为您已经从st
读取了"4"
,所以没有标记了。
如果您想使用StringTokenizer
,那么以下是正确的做法,它将导致将"Mo Farah,30,"
行解析为令牌: "Mo Farah"
和"30"
:
st = new StringTokenizer(nextline, ","); // Just parse the new line.
// You can reuse the old st variable as it is now depleted.
现在,以下代码将从下一行"Mo Farah"
返回第一个令牌。 尽管再次,您确实应该首先检查st.hasMoreTokens()
并给出合理的错误消息:
String name = st.nextToken(); // Change from st2 to st
System.out.println(name);
int age = Integer.parseInt(st.nextToken()); // Ditto
System.out.println(age);
因此,简短的答案是,是的,如果要使用StringTokenizer
,则必须为每行创建一个新的StringTokenizer
。 如果您不在乎行尾,则可以先读取所有行并将它们连接起来,然后再将所有行传递给StringTokenizer
。
但是最简单的方法就是使用String tokens [] = newline.split(“,”); 就像马克在回答中所做的那样。
如果我认为csv中的模式始终相同...:
while(nextline != null){
String[] lecture = reader.readLine().split(",");
if(lecture.lenght()>0){
System.out.println("Name: " + lecture[0]);
int age = Integer.parseInt(lecture[1]);//you need to int?
System.out.println(lecture[1]);
}
else
System.out.println("Name: " + lecture[0]);
}
希望这可以帮助...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.