OpenCSV写作限制

时间:2016-06-09 09:16:23

标签: java csv opencsv

我试图使用openCSV java库在csv文件中编写一些公式数据,但它只在每个单元格中写入了大约90%的字符串。是否存在可能导致此行为的已知问题?

public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException {

        FileOutputStream fosW = new FileOutputStream("C:\\Users\\Desktop\\formula.csv");
        OutputStreamWriter osw = new OutputStreamWriter(fosW, "UTF-8");
        CSVWriter writerCSW = new CSVWriter(osw);

        int k = 0;
        String[] b = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "AA", "AB", "AC", "AD", "AE", "AF", "AG", "AH", "AI", "AJ", "AK", "AL", "AM", "AN", "AO", "AP", "AQ", "AR", "AS", "AT"};
        String[] line = new String[100];
        for (int i = 0; i < b.length - 1; i++) {
            String a = "=IF(legend!" + b[i] + "$3='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] + "$3,IF(legend!" + b[i] + "$4='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] + "$4,IF(legend!" + b[i] + "$5='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] + "$5,IF(legend!" + b[i] + "$6='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] + "$6,IF(legend!" + b[i] + "$7='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] + "$7,IF(legend!" + b[i] + "$8='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] + "$8,#error#))))))";
            System.out.println(a);
            line[k] = a;
            k++;
        }
        writerCSW.writeNext(line);

    }

1 个答案:

答案 0 :(得分:2)

我相信您的问题是您使用的库错了。 (虽然这可能是我的误解。

您的B长度为46.您的CSV文件将包含45个条目。

线[k]正好是1行。我想你假设行数组中的每个索引都是。这是错误号1(可能)。

但是您的文件未完全填充的原因是因为您没有关闭流,因此一旦您的程序存在,数据就会丢失。所以你要关闭你的作家,或者更好的是,使用try-with-resources块。我已经重写了你的代码来执行此操作:

public static void main(String[] args) throws IOException {

        FileOutputStream fosW = new FileOutputStream("/home/artur/tmp/test.csv");
        OutputStreamWriter osw = new OutputStreamWriter(fosW, "UTF-8");
        try (CSVWriter writerCSW = new CSVWriter(osw)) {

            String[] b = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
                    "S", "T", "U", "V", "W", "X", "Y", "Z", "AA", "AB", "AC", "AD", "AE", "AF", "AG", "AH", "AI", "AJ",
                    "AK", "AL", "AM", "AN", "AO", "AP", "AQ", "AR", "AS", "AT" };

            System.out.println(b.length);
            for (int i = 0; i < b.length - 1; i++) {
                String a = "=IF(legend!" + b[i] + "$3='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1]
                        + "$3,IF(legend!" + b[i] + "$4='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1]
                        + "$4,IF(legend!" + b[i] + "$5='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1]
                        + "$5,IF(legend!" + b[i] + "$6='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1]
                        + "$6,IF(legend!" + b[i] + "$7='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1]
                        + "$7,IF(legend!" + b[i] + "$8='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1]
                        + "$8,#error#))))))";
                String[] line = a.split(",");
                writerCSW.writeNext(line);
                System.out.println(i);
            }
        }

    }

注意,我已经改变了一些东西,所以它可能没有完全按照你想要的那样做。但是,你应该能够看到这个例子出了什么问题。

请注意:看看我如何用逗号分割你的字符串a?这是为CSV输入生成一个数组。它会自动为您插入所选的分隔符。如果您不想这样做,请删除CSVWriter,并使用普通的Filewriter。您可以通过构造String来手动生成CSV行。使用OpenCSV时不需要这样做。

我希望有所帮助,

阿图尔