【问题标题】:read rgb values stored in csv file seperated by comma deliminator读取存储在 csv 文件中的 rgb 值,由逗号分隔符分隔
【发布时间】:2017-04-05 17:53:15
【问题描述】:

我正在使用文件阅读器读取 csv 文件,csv 文件的第二列是 rgb 值,例如 rgb(255,255,255),但 csv 文件中的列用逗号分隔。如果我使用逗号分隔符,它会显示为“rgb(255”,那么我如何读取整个 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);
                }
            }

【问题讨论】:

    标签: java csv colors rgb


    【解决方案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 解析器会为您处理这些事情。你不应该重新发明轮子。

    【讨论】:

    • 非常感谢!很有帮助!
    【解决方案2】:
        line = "rgb(25,255,255)";
        line = line.replace(")", "");
        line = line.replace("rgb(", "");
        String[] vals = line.split(",");
    

    将 vals 中的值转换为 Integer,然后您就可以使用它们了。

    【讨论】:

      【解决方案3】:

      你可以这样做:

      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
      

      虽然() 是元字符,但我们必须对其进行转义。

      【讨论】:

      • 非常感谢!它通过使用您的方法起作用。但是如何调用 group() 通过使用 rgb 值来设置饼图的样式来绘制饼图?谢谢!我在使用控制器并在initialize()中调用了read方法和plot方法,我唯一做错的是饼图的颜色。
      • 如果你想得到红色使用m.group(1),绿色使用m.group(2),蓝色使用m.group(3)
      • 是的,我尝试调用 m.group();在 initialize() 方法中设置饼图样式,但它无法识别 m.group()。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      • 2020-03-20
      • 1970-01-01
      • 2016-09-28
      • 1970-01-01
      • 2016-04-22
      相关资源
      最近更新 更多