从PSV文件Java读取

时间:2012-06-04 14:32:26

标签: java

我想用java读取PSV文件。我的PSV文件中的记录有4列。我想只读取和输出第3列和第4列。做这个的最好方式是什么。 这就是我所拥有的:

BufferedReader PSVFile = new BufferedReader(new FileReader(fileName));
String dataRow = PSVFile.readLine();
while (dataRow != null)
{
    String[] dataArray = dataRow.split("\n");
    for (String item:dataArray) 
    {
        String[] elements = item.split("|");
        System.out.println(item);
    }
    System.out.println();
    dataRow = PSVFile.readLine();
}
PSVFile.close();
System.out.println();

基于@AljoshaBre建议Iam使用CSVReader,执行此操作:

reader = new CSVReader(new FileReader(fileName),'|');
String [] nextLine;
while ((nextLine = reader.readNext()) != null) 
{
 System.out.println( nextLine[3] + nextLine[4]);
}

我得到了所需的输出,但后来出错了:     线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException:2     在Read_PSV.main(Read_PSV.java:20) 第20行是System.out.println(nextLine [3] + nextLine [4]);

2 个答案:

答案 0 :(得分:0)

OpenCSV是我的首选武器。

此代码段将为您提供第三和第四列:

try {
    //last parameter tells it which line (row) to consider as the first one
    CSVReader reader = new CSVReader(new FileReader("res/test.csv"), '|', '\0', 1);
    String[] row;

    List<String> columnThree    = new ArrayList<String>();
    List<String> columnFour     = new ArrayList<String>();

    while((row = reader.readNext()) != null) {
        columnThree.add(row[2]);
        columnFour.add(row[3]);
    }
    reader.close();
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

会打印

Nikola
Nenad
Ljubinka
Gordana

输入:

test.psv

Name|Surname|Father|Mother
Aleksandar|Milic|Nikola|Ljubinka
Nebojsa|Jakovljevic|Nenad|Gordana

答案 1 :(得分:0)

Commons-Lang也有一个很好的课程:

// get a csv instance (which is cloned, so we can customize it)
StrTokenizer tokenizer = StrTokenizer.getCSVInstance();

// Set delimiter char
tokenizer.setDelimiterChar('|');

Scanner scanner = new Scanner(new File("file.psv"));
while (scanner.hasNextLine()) {
  // set the input on the tokenizer
  tokenizer.reset(scanner.nextLine());
  // get the tokens
  String toks[] = tokenizer.getTokenArray();
}

注意:StrTokenizer本身设计为一次只能处理一条记录,所以你必须使用像java的Scanner这样的东西一次拉一行。 StrTokenizer本身可以通过“重置”方法重用(虽然不是线程安全的)。

它有很多选项,例如引号字符,空格处理,空令牌处理等等......不确定opencsv会有哪些选项。