【问题标题】:Null value adding when creating CSV string in JAVA在 JAVA 中创建 CSV 字符串时添加空值
【发布时间】:2013-02-23 16:27:36
【问题描述】:

我有一个表单,我从 3 个复选框中获取值。我在 servlet 中得到的值如下,

String csvSkills = null;

String[] skills = request.getParameterValues("chkSkills");

for(int i=0; i<skills.length; i++){
    csvSkills   +=  skills[i]+",";
}

System.out.println(csvSkills);

输出:

nullPHP,JAVA,MYSQL,

虽然最初 csvSkills 值为 null,但显示的是 null 值。我尝试了很多,不知道如何做到这一点。我的疑问是如何在没有 null 的情况下制作 csv 值? 希望我的问题很清楚。提前致谢!

【问题讨论】:

    标签: java jsp servlets csv


    【解决方案1】:

    其他答案告诉你为什么会有一个空值:你没有初始化你的 csvSkills 字符串。

    您应该知道的另一件事是,您应该为 csvSkills 使用 StringBuilder 而不是 String。在循环内附加到字​​符串非常效率低下。在幕后,编译器每次通过循环创建一个新的 StringBuilder 以将两个字符串连接在一起,然后将其丢弃。每次通过循环,为该迭代创建的 StringBuilder 的大小都会变得越来越大。您想对所有附加使用单个 StringBuilder 实例。

    StringBuilder  csvSkills = new StringBuilder();
    for (String s:  request.getParameterValues("chkSkills")){
        if (csvSkills.length > 0) csvSkills.append(",");
        csvSkills.append(s);
    }
    return csvSkills.toString();
    

    我是处理 CSV 的免费开源 Java 实用程序的作者。我建议为此使用the Ostermiller CSV library。除了处理仅在需要时附加逗号的逻辑外,它还会在您附加的字段包含引号或逗号的情况下处理引用和转义。

    StringWriter writer = new StringWriter();
    CSVPrinter  csvSkills = new ExcelCsvPrinter(writer);
    for (String s:  request.getParameterValues("chkSkills")){
        csvSkills.write(s);
    }
    return writer.toString();
    

    【讨论】:

      【解决方案2】:

      csvSkills 初始化为空字符串,而不是null

      String csvSkills = "";
      

      当你在java中用null连接字符串时,你得到null的文本表示。此外,如果您不想在列表末尾添加逗号,则可以有条件地添加逗号。像这样的:

      for (int i=0; i<skills.length; i++){
          if (i > 0) {
              csvSkills += ",";
          }
          csvSkills += skills[i];
      }
      

      【讨论】:

      • @JavaBegginer:nullskills 数组中的第一个值吗?您的表单是否以某种方式提交 null 作为第一个值?
      • @Asaph 上面是错误的,它要追加,最后像 php,mysql,java,
      • @JavaBeginner 我不认为这是错误的。它将在数组元素之间放置逗号,而不是在开头或结尾。尝试运行它。你会看到的。
      【解决方案3】:

      您希望将“csvSkills”初始化为“”(空字符串)而不是 null。

      还可以考虑添加一个 if 语句来判断是否添加逗号,这样末尾就没有逗号。

      【讨论】:

      • 我无法将值初始化为空
      • 为什么不呢?这是字符串连接的标准习语。
      • 现在我确实喜欢这个 String csvSkills = "''";并获取输出为 ''PHP,JAVA,MYSQL,
      • @JavaBeginer 您使用的是“''”而不是“”?
      【解决方案4】:

      您需要将csvSKills 初始化为一个空字符串""

      String csvSkills = "";
      

      更好的解决方案是使用StringBuilder 连接大量Strings:

      StringBuilder csvSkills = new StringBuilder();
      
      String[] skills = request.getParameterValues("chkSkills");
      
      for (String skill : skills) {
          csvSkills.append(skill).append(",");
      }
      
      System.out.println(csvSkills.toString());
      

      【讨论】:

        【解决方案5】:

        仅当 csvSkills 大于 0 时才应添加逗号

        StringBuilder csvSkills = new StringBuilder();
        
        String[] skills = request.getParameterValues("chkSkills");
        
        for (String skill : skills) 
        {
           if(csvSkills.length() > 0)
            csvSkills.append(",");
        
           csvSkills.append(skill);
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-09-27
          • 2017-12-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-30
          相关资源
          最近更新 更多