2017-04-05 155 views
0

我正在使用文件讀取器讀取csv文件,csv文件的第二列是一個rgb值,例如rgb(255,255,255),但csv文件中的列是用逗號分開。如果我使用逗號deliminator,它會讀像「RGB(255,」所以我怎麼看完整RGB值,代碼粘貼下面。謝謝!讀取存儲在csv文件中的rgb值,用逗號分隔符分隔

 FileReader reader = new FileReader(todoTaskFile); 
     BufferedReader in = new BufferedReader(reader); 

     int columnIndex = 1; 
     String line; 

     while ((line = in.readLine()) != null) { 
      if (line.trim().length() != 0) { 
       String[] dataFields = line.split(","); 
       //System.out.println(dataFields[0]+dataFields[1]); 
       if (!taskCount.containsKey(dataFields[columnIndex])) { 
        taskCount.put(dataFields[columnIndex], 1); 
       } else { 
        int oldCount = taskCount.get(dataFields[columnIndex]); 
        taskCount.put(dataFields[columnIndex],oldCount + 1); 
       } 
      } 

回答

0
line = "rgb(25,255,255)"; 
    line = line.replace(")", ""); 
    line = line.replace("rgb(", ""); 
    String[] vals = line.split(","); 

投瓦爾斯的值整數,然後你可以用它們

0

這裏是你如何能做到這一點:

Pattern RGB_PATTERN = Pattern.compile("rgb\\((\\d{1,3}),(\\d{1,3}),(\\d{1,3})\\)"); 

String line = "rgb(25,255,255)"; 
Matcher m = RGB_PATTERN.matcher(line); 
if (m.find()) { 
    System.out.println(m.group(1)); 
    System.out.println(m.group(2)); 
    System.out.println(m.group(3)); 
} 

這裏

\\d{1,3} => match 1 to 3 length digit 
(\\d{1,3}) => match 1 to 3 length digit and stored the match 

雖然()是元字符,我們必須逃避它。

+0

非常感謝!它通過使用你的方法起作用。但是,如何通過使用rgb值來設置餅圖的樣式來調用group()來繪製餅圖?謝謝!我正在使用一個控制器,並在initialize()中調用read方法和plot方法,唯一錯誤的是餅圖的顏色。 –

+0

如果你想獲得紅色使用'm.group(1)',綠色使用'm.group(2)',藍色使用'm.group(3)' –

+0

是的,我試着打電話給m 。組();在initialize()方法中設置餅圖的樣式,但它不會識別m.group()。 –

1

我強烈建議不要使用自定義方法來解析CSV輸入。有專門的圖書館爲你做。

@Ashraful Islam發佈了一個很好的方式來解析來自「單元格」(我重複使用它)的值,但獲取這個「單元格」原始值必須以不同的方式完成。該草圖顯示瞭如何使用apache.commons.csv庫進行操作。

package csvparsing; 

import org.apache.commons.csv.CSVFormat; 
import org.apache.commons.csv.CSVRecord; 

import java.io.FileReader; 
import java.io.IOException; 
import java.io.Reader; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class GetRGBFromCSV { 

    public static void main(String[] args) throws IOException { 
     Reader in = new FileReader(GetRGBFromCSV.class.getClassLoader().getResource("sample.csv").getFile()); 
     Iterable<CSVRecord> records = CSVFormat.DEFAULT.withFirstRecordAsHeader().parse(in); // remove ".withFirstRecordAsHeader()" 
     for (CSVRecord record : records) { 
      String color = record.get("Color"); // use ".get(1)" to get value from second column if there's no header in csv file 
      System.out.println(color); 

      Pattern RGB_PATTERN = Pattern.compile("rgb\\((\\d{1,3}),(\\d{1,3}),(\\d{1,3})\\)", Pattern.CASE_INSENSITIVE); 

      Matcher m = RGB_PATTERN.matcher(color); 
      if (m.find()) { 
       Integer red = Integer.parseInt(m.group(1)); 
       Integer green = Integer.parseInt(m.group(2)); 
       Integer blue = Integer.parseInt(m.group(3)); 
       System.out.println(red + " " + green + " " + blue); 
      } 
     } 

    } 

} 

這是一個自定義的有效CSV輸入這將可能使基於正則表達式的解決方案表現出乎意料:

Name,Color 
"something","rgb(100,200,10)" 
"something else","rgb(10,20,30)" 
"not the value rgb(1,2,3) you are interested in","rgb(10,20,30)" 

有很多,你可能會忘記,當你編寫自定義考慮到期權解析器:帶引號和不帶引號的字符串,引號內的分隔符,引號內的引號轉義,不同的分隔符(,;),多列等等。第三方csv解析器會爲您處理這些事情。你不應該重新發明輪子。

+0

非常感謝!它有很大幫助! –

+0

[Ok; - )](https://stackoverflow.com/help/someone-answers) –