2012-06-04 182 views
0

我想使用java讀取PSV文件。我的PSV文件中的記錄有4列。我只想讀取並輸出第3列和第4列。做這個的最好方式是什麼。 以下是我有:從PSV文件讀取Java

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]); 
} 

我得到所需的輸出,但隨後得到一個錯誤: 異常在線程「 (ReadLoadLine [3] + nextLine [4]);第20行是System.out.println(nextLine [3] + nextLine [4]);第20行是System.out.println(nextLine [3] + nextLine [

+0

管道分離或週期分離? – Brendan

+0

管道分離。 – Ram

+0

如果你得到這個例外,這可能意味着你的令牌數組沒有你想象的那麼大。也許你沒有正確處理空白行(即0或1長度的令牌數組(取決於opencsv在這種情況下想要返回的數據)。 – Matt

回答

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 
+0

我現在正在使用CSVReader,但出現錯誤。 – Ram

+0

你的循環不好,嘗試使用CSVReader get()方法獲得列,就像我做的那樣。 – nullpotent

+0

@ AljoshaBre-似乎沒有get()方法。我得到以下錯誤。「方法get(int)未定義爲類型CSVReader「 – Ram

0

共享郎有這一個很好的類以及:

// 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的掃描儀拉一次一行。 StrTokenizer本身可通過「重置」方法重新使用(儘管不是線程安全)。

它有一系列選項,如引號字符,空白處理,空標記處理等等......不確定opencsv會有什麼選項。