0

我想使用 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 建议我使用 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 at Read_PSV.main(Read_PSV.java:20) 第 20 行是 System.out.println( nextLine[3] +下一行[4]);

4

2 回答 2

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

对于这个输入:

测试.psv

Name|Surname|Father|Mother
Aleksandar|Milic|Nikola|Ljubinka
Nebojsa|Jakovljevic|Nenad|Gordana
于 2012-06-04T14:46:24.547 回答
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 本身可以通过“reset”方法重用(尽管不是线程安全的)。

它有许多选项,例如引号字符、空格处理、空标记处理等……不确定 opencsv 会有哪些选项。

于 2012-06-04T19:51:31.093 回答