3

我编写了一个 Java 类来生成 CSV 文件:

public class CSVGenerator {

    private static String REFERRAL_HEADER = "Position,Mail,Invitations,Qualified invitations";
    private static String TOPS_HEADER = "Position,Mail,Number of conferences,Number of new contacts, Average conf duration";

    public static String generate(String source, JsonNode root) throws IOException {
        String result = "";
        CSVWriter writer = new CSVWriter(new FileWriter(source+".csv"));
        if (source.compareTo("referral") == 0)
            result = REFERRAL_HEADER;
        else if (source.compareTo("tops") == 0)
            result = TOPS_HEADER;
        writer.writeNext(result.split(","));
        Iterator<JsonNode> it = root.getElements();
        while (it.hasNext()) {
            Iterator<JsonNode> it2 = it.next().getElements();
            result = "";
            while (it2.hasNext())
            {
                result += it2.next().asText();
                if (it2.hasNext())
                    result += ",";
            }
            writer.writeNext(result.split(","));
        }
        writer.close();
        return result;
    }
}

生成的文件格式不正确。一行只有一个单元格,包含所有单元格和分隔逗号,如下所示:

header1,header2,header3
1,support,test
2,alpha,gamma

我究竟做错了什么 ?

编辑:

为了更精确地输出

我有:"header1,header2,header3","",""

我想要:“header1”、“header2”、“header3”

这是我的输出。每一行在一个唯一的单元格中。

   ""Position","Mail","Invitations","Qualified invitations""
    ""1","xxxxx.com","129","23""
    ""2","xxxx.com","54","8""
    ""3","xxxx.com","197","5""
    ""4","xxxx","13","5""
    ""5","xxxx","8","4""
    ""6","xxxx.com","4","4""
    ""7","xxx.com","31","3""
    ""8","xxx.com","30","3""
    ""9","xxx.com","18","3""
    ""10","xxx.com","13","3""
4

4 回答 4

-1

您是否尝试在结果属性周围加上引号?

result += "\""+data.asText()+"\"";

请记住,我不熟悉 jsondata 对象。

此外,您应该逐行编写每一行,而不是在最后附加所有内容。

是的,看看内置的 CSVReader 和 CSVWriter。

于 2013-07-19T15:28:20.920 回答
-1

也许这样会更好。干杯!

result += \"+data.asText()+\";
于 2013-07-19T15:20:37.887 回答
-1

尝试在标题字段周围添加引号:

private static String REFERRAL_HEADER = "\"Position\",\"Mail\",\"Invitations\",\"Qualified invitations\"\n";
private static String TOPS_HEADER = "\"Position\",\"Mail\",\"Number of conferences\",\"Number of new contacts\", \"Average conf duration\"\n";
于 2013-07-19T15:43:19.043 回答
-1

我在 groovy shell 中尝试了您的代码子集,得到了正确的结果:

groovy:000> string = new java.io.StringWriter()
===> 
csv = new CSVWriter(string)
===> au.com.bytecode.opencsv.CSVWriter@4d9ac0b4
groovy:000> csv.writeNext(REFERRAL_HEADER.split(","))
===> null
groovy:000> string.toString()
===> "Position","Mail","Invitations","Qualified invitations"

您可以尝试使用commons-csv而不是 CSVWriter。该库有点时髦,因为它是为数据库量身定制的。

于 2015-08-27T03:43:32.173 回答