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の提案に基づいて、IamはCSVReaderを使用して、これを行っています:

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

必要な出力を取得していますが、エラーが発生します: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 at Read_PSV.main(Read_PSV.java:20) Line 20 is System.out.println( nextLine[3] + nextLine[4]);

4

2 に答える 2

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 自体は一度に 1 つのレコードで動作するように設計されているため、Java の Scanner などを使用して一度に 1 行ずつ取得する必要があります。StrTokenizer 自体は、「リセット」メソッドを介して再利用できます (スレッドセーフではありません)。

引用符文字、空白の処理、空のトークンの処理など、多くのオプションがあります.opencsvにどのようなオプションがあるのか​​ わかりません。

于 2012-06-04T19:51:31.093 に答える
0

OpenCSVは私が選んだ武器です。

このスニペットは、3 番目と 4 番目の列を取得します。

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 に答える