Java解析csv类

时间:2015-05-28 06:24:53

标签: java regex parsing csv

我在java中创建一个用CSV解析的类。它将逐行读取文件,并根据正则表达式将每个字段解析成一个数组,然后打印该数组。我将所有这些放在下面的主驱动器中。我查看了一切,它似乎是功能性的,但出于某种原因,无论何时我运行它,它只是陷入无限循环而不会停止。我已经多次查看过了,但却找不到这种情况。任何有关此问题的帮助将不胜感激!

import java.io.FileInputStream;
import java.io.IOException;
import java.util.regex.Pattern;

/**
 *
 */
public class Csv {

    private  FileInputStream fin;
    private  String line;
    private  String[] parsedFields;


    public boolean isEOL(char n) {
        boolean eol;

        if (n == '\n' || n == '\r') {
            eol = true;
        }

        else
            eol=false;

        return eol;
    }

    public String getLine()
    {
        try
        {
            char c;
            c= (char) fin.read();

            while(!isEOL(c))
            {
                line+=c;
            }
        }


        catch (IOException e) {
        System.out.println("Input Error.");
    }


        return line;

    }

    public void parseFields(String s)
    {
        Pattern CSVLine=Pattern.compile("\"([^\"]*)\"|(?<=,|^)([^,]*)(?:,|$)");
        parsedFields=CSVLine.split(s);


    }

    public void execute()
    {
        String field=getLine();
        parseFields(field);
    }
    public void setFin(FileInputStream usrFin)
    {
        fin=usrFin;
    }

    public void outputFields()
    {
        for(int i=0; i<parsedFields.length;i++)
        {
            System.out.println(parsedFields[i]);
        }
    }

    public static void main(String args[])
    {
       try {
           FileInputStream fis;
           fis = new FileInputStream("test.txt");
           Csv test= new Csv();
           test.setFin(fis);
           test.execute();
           test.outputFields();
       }
        catch (IOException e) {
        e.printStackTrace();
    }

    }
}

2 个答案:

答案 0 :(得分:0)

c= (char) fin.read();

        while(!isEOL(c))
        {
            line+=c;
        }

在这部分中,你循环,添加c,但你再也不会读。 c在循环期间永远不会改变,并且可能会卡在那里。你也需要在循环中设置c = fin.read();

答案 1 :(得分:0)

public static List<String> readLine(String filePath){
        List<String> listStr = new ArrayList<String>();
        try {
            BufferedReader br = new BufferedReader(new FileReader(filePath));
            String line = null;
            Pattern pat = Pattern.compile(LINE_PATTERN_REGEXP);
            while((line=br.readLine())!=null){              
                Matcher matcher = pat.matcher(line);                
                if(!matcher.find()){    
                    listStr.add(line);                  
                }       
            }
            br.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return listStr;
        }
}