Java - 从第二行开始读取文本文件

4

我想在Java中读取一个txt文件。但是,我只想从第二行开始读取,因为第一行只是一个标签。这是示例:

文本文件:

Name,Type,Price
Apple,Fruit,3
Orange,Fruit,2
Lettuce,Veggie,1

我该如何做到这一点?我有这样的代码,可以从第一行读取。

代码:

//read the file, line by line from txt
File file = new File("train/traindata.txt");
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
String line;

line = br.readLine();

while(line != null)
{
    lines = line.split(",");

    //Do something for line here
    //Store the data read into a variable

    line = br.readLine();         
}

fr.close();

请帮我,提前感谢。

6个回答

15

只需要增加一个额外的BufferedReader#readLine调用即可...

br.readLine(); // consume first line and ignore
line = br.readLine();
while(line != null) ...

2
这个答案证明了“不要把它变得比必须的更难” :-) - Gikkman
@Gikkman 但这也是一个很好的例子,说明不太健壮的代码如何产生。 - GhostCat
@GhostCat 你说得很对。根据项目所需的稳健性和持久性,简单的解决方案并不总是正确的选择。 - Gikkman
谢谢你的解决方案,这正是文本文件所需的哈哈。 - Jason Christopher

3
如果您有兴趣使用第三方库,这里提供一个示例,使用Apache Commons CSV(它将跳过标题,但保留其映射以从记录中检索字段)。
根据您的文件编码修改字符集。
   CSVParser parser = CSVParser.parse(file, Charset.forName("UTF-8"),CSVFormat.RFC4180.withFirstRecordAsHeader().withSkipHeaderRecord());

   List<CSVRecord> records = parser.getRecords();

   for (CSVRecord record : records) {

       System.out.println(record.get("Name"));
       System.out.println(record.get("Type"));
       System.out.println(record.get("Price"));
   }

1
在 while 循环中只需执行以下操作:
line = br.readLine();

while((line=br.readLine()) != null)
{
    lines = line.split(",");

    //Do something for line here
    //Store the data read into a variable

    line = br.readLine();         
}

fr.close();

1

我认为你正在将文本文件转换为CSV解析器

因此我建议你...

br.readLine(); // Header of CSV
line = br.readLine();
while(line != null)
{
 // Your Logic
} 

0

只需阅读并跳过第一行

//read the file, line by line from txt
File file = new File("train/traindata.txt");
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
String line;

line = br.readLine();
boolean first = true;
while(line != null)
{
    if (first) {
      first = false;
    } else {
      lines = line.split(",");

      //Do something for line here
      //Store the data read into a variable

      line = br.readLine();         
    }
}

fr.close();

0
我提出了一个有点不同的解决方案:忽略行而不查看它们...当然可以工作;但是这种方法在文件内容发生更改时并不是非常健壮!
如果您更改文件以包含什么会发生呢?

header

data

或者

data
data

所以,我的建议是——保留你当前的代码,但确保只选择具有有效数据的行;例如,通过重新编写循环体:
lines = line.split(",");
if (lines.length == 3 && isNumber(lines[2])) ...

isNumber()是一个小助手函数,用于检查传入的字符串是否为数字。

换句话说:有意地跳过行会将文件布局的知识隐式地硬编码到您的“解析器”中。这对于简单的练习可能没问题,但在现实世界中,这种做法将来某个时刻肯定会出问题。然后就开始了有趣的事情。因为没有人会记得解析代码是写成要丢弃文件的第一行。

正如所示,您可以轻松避免这种问题!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接