我正在使用java中的缓冲读取器读取tsv文件中的每一行,然后将其存储在数组中并打印数组。但是记录从文件的中间打印而不是从头开始。
public class Test {
public static void main(String args[]) throws IOException
{
UserItemsTsvParser u=new
UserItemsTsvParser("./data/user_items/users_movies.tsv");
ItemsTsvParser a =new ItemsTsvParser("./data/items/books.tsv");
while(!(a.hasReachedEndOfFile()))
{
a.readNextLine();
}
}
}
我正在调用另一个类的方法:
public ItemsTsvParser(String relativeFilePath)
throws IOException {
fileReader=new BufferedReader(new FileReader(relativeFilePath));
System.out.println(relativeFilePath);
currentLine=fileReader.readLine();
}
/**
* It reads the next line of the file.
* @return
* @throws IOException
*/
int i=0;
public void readNextLine() throws IOException {
while((currentLine=fileReader.readLine())!=null)
{
System.out.print(i++);
currentLineTokens=currentLine.split("\t");
currentItemId=currentLineTokens[0];
currentItemType=currentLineTokens[1];
currentItemUri=currentLineTokens[2];
System.out.println(Arrays.toString(currentLineTokens));
}
}
/**
* Returns TRUE if EOF has been reached by the reader.
* @return
* @throws IOException
*/
public boolean hasReachedEndOfFile() throws IOException{
if(currentLine==null)
{
return true;
}
else
{
return false;
}
}
答案 0 :(得分:0)
.split("\t");
是一个非常慢的操作。此外,如果某些字段已转义字符,例如\
后跟制表符(\t
),或者如果有\
后跟字母{{1},则您的解决方案将失败}。
不要使用CSV解析器,因为它不会处理这类事情,你需要一个合适的TSV解析器,例如univocity-parsers提供的解析器。
您可以像这样使用它:
t
希望这有帮助。
免责声明:我是这个图书馆的作者,它的开源和免费(Apache 2.0许可证)