如何在java中从第二行读取CSV?

时间:2013-11-26 08:43:10

标签: java csv

我有逗号分隔的CSV文件,我有从第二行读取它的代码。但它给了我以下错误。 线程“AWT-EventQueue-0”中的异常java.lang.OutOfMemoryError:Java堆空间

这是我的代码。

public static List<String> readCSV(String path){        
    BufferedReader br = null;
    String[] cd = null;
    String line ="";
    String split=",";
    List<String> list = new ArrayList<String>();
    try {        
        br=new BufferedReader(new FileReader(path));            
        while ((line = br.readLine()) != null) {
            boolean firstLine = true;               
            while (line != null && line.startsWith("child's Last Name")) {
                if (firstLine) {
                    firstLine = false;
                    continue;
                } else {
                    list.add(line);
                }
            }               
        }               
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (br != null) {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return list;
}   

如何使用此代码修复它..

提前致谢!

5 个答案:

答案 0 :(得分:1)

在您的第二个while循环中,您又在哪里分配line

 while (line != null && line.startsWith("child's Last Name"))

一旦满足此条件,您就不会重新分配它 你的代码应该是不同的,比如,

boolean firstLine = true;               
while ((line = br.readLine()) != null) 
{
   if (firstLine) 
   {
      firstLine = false;
       continue;
   } 
   else if(line != null && line.startsWith("child's Last Name"))
   {
        list.add(line);
   }
}    

答案 1 :(得分:0)

通常,当你......嗯......内存不足以运行应用程序时,会出现内存不足错误。你调试过了吗?你可能陷入无休止的循环......

while (line != null && line.startsWith("child's Last Name")) {

这应该是if语句吗?

编辑:

while ((line = br.readLine()) != null) {

这应该是:

while(br.hasNext()) {

更多信息:Java - Read CSV with Scanner()

答案 2 :(得分:0)

你的问题与第二行没有关系;你只是试图将整个文件放在list中,最终,这些内容太多而无法适应内存。你有两个选择:

  • 不要把它全部留在记忆中!处理生产线,做你必须做的事情,不要存储它,因此它最终会被垃圾收集
  • 如果你真的必须将它全部保留在内存中,请尝试通过使用-Xmx参数启动java来增加可用的堆空间量(运行java -X以获取详细信息)

更新:哦,哎呀,是的,正如其他人所说,你也陷入了无尽的循环。一旦你修复了这个答案,请考虑这个答案!

答案 3 :(得分:0)

尝试

    br=new BufferedReader(new FileReader(path));            
    boolean firstLine = true;               
    while ((line = br.readLine()) != null) {
        if (line.startsWith("child's Last Name")) {
            if (firstLine) {
                firstLine = false;
                continue;
            } 
            list.add(line);
        }               
    }   

不需要两个while循环

答案 4 :(得分:-1)

试试这个..

    br=new BufferedReader(new FileReader(path)); 
    br.readLine();           
    while ((line = br.readLine()) != null) {
         if (line.startsWith("child's Last Name")) {
                 list.add(line);
         }               
    }