OpenCSV 写入限制

OpenCSV writing limits

我试图使用 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] + "='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] + ",IF(legend!" + b[i] + "='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] + ",IF(legend!" + b[i] + "='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] + ",IF(legend!" + b[i] + "='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] + ",IF(legend!" + b[i] + "='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] + ",IF(legend!" + b[i] + "='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1] + ",#error#))))))";
            System.out.println(a);
            line[k] = a;
            k++;
        }
        writerCSW.writeNext(line);

    }

我认为您的问题是您使用的库有误。 (虽然这可能是我的误会。

您的 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] + "='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1]
                        + ",IF(legend!" + b[i] + "='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1]
                        + ",IF(legend!" + b[i] + "='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1]
                        + ",IF(legend!" + b[i] + "='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1]
                        + ",IF(legend!" + b[i] + "='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1]
                        + ",IF(legend!" + b[i] + "='Form responses 1'!" + b[i + 1] + "2,legend!" + b[i + 1]
                        + ",#error#))))))";
                String[] line = a.split(",");
                writerCSW.writeNext(line);
                System.out.println(i);
            }
        }

    }

请注意,我更改了一些内容,因此它可能无法完全按照您的要求进行操作。但是,您应该能够从这个示例中看出问题所在。

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

希望对您有所帮助,

亚瑟