[英]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.