读取存储在由逗号分隔的 CSV 文件中的 RGB 值



我正在使用文件阅读器读取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);
                }
            }

我强烈建议不要使用自定义方法来解析CSV输入。有专门的库可以为您做到这一点。

@Ashraful伊斯兰教发布了一种从"单元格"解析值的好方法(我重用了它(,但是获取这个"单元格"原始值必须以不同的方式完成。此草图显示了如何使用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解析器会为您处理这些事情。你不应该重新发明轮子。

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

将 vals 中的值转换为整数,然后您可以使用它们。

这是您可以执行此操作的方法:

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

虽然()是元角色,但我们必须逃避它。

最新更新