读取存储在由逗号分隔符分隔的csv文件中的rgb值

时间:2017-04-05 17:53:15

标签: java csv colors 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);
                }
            }

3 个答案:

答案 0 :(得分: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)"

在编写自定义解析器时,您可能会忘记考虑很多选项:引用和未引用的字符串,引号内的分隔符,引号内的转义引号,不同的分隔符(,或{{1} }),多列等。第三方csv解析器会为你处理这些事情。你不应该重新发明轮子。

答案 1 :(得分:0)

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

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

答案 2 :(得分: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

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