【问题标题】:How to convert a List<String> list to csv string如何将 List<String> 列表转换为 csv 字符串
【发布时间】:2012-11-05 01:56:16
【问题描述】:

我有一个List 字符串。是否有 Java 方便的方法可以将此 List 转换为 CSV String?所以 "test1, test2, test3" 是包含 "test1" "test2" "test3" 的 List 3 个字符串元素的转换结果

我可以自己编写方法来转换String,但也许这已经由 API 实现了?

【问题讨论】:

    标签: java string csv


    【解决方案1】:

    Apache Commons Lang 包含一个 StringUtils.join() 方法正是为了这个目的。请注意,存在不同的风味。

    截至 2014 年 3 月,Java 8 现在有一个 StringJoiner

    【讨论】:

    • 在幼稚的情况下这已经足够了,但如果字符串本身包含逗号、引号或换行符,它将失败。
    • 链接已失效,也许commons.apache.org/proper/commons-lang/apidocs/org/apache/… 可以替代?
    • @Marc-Andre - 现在已修改。谢谢
    • 一个很好的答案,但如果它给出使用示例会更好。例如。 String myCsvString = StringUtils.join(myList, ",") 用于 Apache Commons 方法。
    • 哦,StringJoiner 很好。 String myCsvString = String.join(",", myList);
    【解决方案2】:

    如果您使用的是 Java 8

    List<String> objects= Arrays.asList("Test1","Test2","Test3");
    String objectsCommaSeparated = String.join(",", objects);
    System.out.println(objectsCommaSeparated);
    

    使用流

    String objectsCommaSeparated = objects.stream().collect(Collectors.joining(","));
    System.out.println(objectsCommaSeparated);
    

    【讨论】:

      【解决方案3】:

      有一个名为 Joiner 的 Guava 类可以轻松创建此类字符串。

      Joiner.on(",").join(yourStrings)

      【讨论】:

        【解决方案4】:

        org.springframework.util.StringUtils中有几个有用的方法。

        例子:

        String text = StringUtils.arrayToCommaDelimitedString(new Object[]{"test1", "test2", "test3"});
        

        更多详情: http://static.springsource.org/spring/docs/1.2.9/api/org/springframework/util/StringUtils.html

        【讨论】:

          【解决方案5】:

          写了这个简单的方法;

          String listToCsv(List<String> listOfStrings, char separator) {
              StringBuilder sb = new StringBuilder();
          
              // all but last
              for(int i = 0; i < listOfStrings.size() - 1 ; i++) {
                  sb.append(listOfStrings.get(i));
                  sb.append(separator);
              }
          
              // last string, no separator
              if(listOfStrings.size() > 0){
                  sb.append(listOfStrings.get(listOfStrings.size()-1));
              }
          
              return sb.toString();
          }
          

          【讨论】:

          • 如果列表为空会崩溃
          • 我认为这正是人们应该接受编写良好且经过调试的库的原因
          【解决方案6】:

          如果您只想使用核心 java,我认为您可以使用以下内容。

          java.util.Arrays.toString(list.toArray(new String[list.size()]).replace("[", "\"").replace("]", "\"");
          

          警告:我尚未检查所有情况。 ;)

          Arrays.toString 会产生类似的东西

          [a], [b], [c]
          

          如果您列出包含a, b, c

          我们可以在这里使用逗号分隔这一事实,只需删除方括号并将其替换为",以用于逗号在数据中的情况。如果你不需要这个,你可以这样做replace("[", ""

          【讨论】:

            【解决方案7】:

            不,JDK 中没有可用的便捷方法。您可以创建自己的,但对于一般情况,这并不像看起来那么简单(例如,当字段包含分隔符、换行符或文本分隔符时):

            • 字段包含换行符:字段必须被引用
            • 字段包含文本分隔符:分隔符加倍
            • 字段包含分隔符:字段必须被引用

            例子:

            String[] fields = { "\n", ""he said \"hello\"", "," }
            

            应该给你这个:

            "
            ","he said ""hello""",","
            

            编辑:这是一个提议的RFC for CSV

            EDIT2:如果有人对实现感兴趣,请发表评论,我家里的硬盘上有一个。

            【讨论】:

              【解决方案8】:
              public class StringUtil {
              
                  public String toCsv(final List<?> list) {
                      return toString(list, ',');
                  }
              
                  public String toString(final List<?> list, char delimiter) {
                      final StringBuilder b = new StringBuilder();
                      if (list != null) {
                          for (int i = 0; i < list.size(); i++) {
                              b.append(list.get(i).toString());
                              if (i != list.size() - 1) {
                                  b.append(delimiter);
                              }
                          }
                      }
                      return b.toString();
                  }
              }
              

              【讨论】:

                【解决方案9】:

                这就是我正在做的事情

                  @Test
                    public void testString(){
                        List<String> listOfWords = Arrays.asList("Some","Other","lalala");
                
                        final String fields = listOfWords.stream().reduce((t, u) -> t + "," + u).get();
                        System.out.println("Look "+fields);
                    }
                

                【讨论】:

                • 这里是imo的最佳答案
                【解决方案10】:

                此代码处理包含引号、逗号和其他麻烦字符的数据:

                公共类 ToCsv {

                private static final String QUOTE = "\"";
                private static final Pattern NON_WORD = Pattern.compile(".*\\W.*");
                
                public final static String toCsv(final List<Object> list) {
                    final StringBuilder sb = new StringBuilder();
                    String sep = "";
                    for (final Object object : list) {
                        String s = object.toString();
                        final Matcher m = NON_WORD.matcher(s);
                        if (m.matches()) {
                            if (s.contains(QUOTE)) {
                                s = s.replaceAll(QUOTE, "\"\"");
                            }
                            sb.append(sep).append(QUOTE).append(s).append(QUOTE);
                        } else {
                            sb.append(sep).append(s);
                        }
                        sep = ",";
                    }
                    return sb.toString();
                } }
                

                【讨论】:

                  【解决方案11】:

                  使用此代码

                   public static String listToString(List list) {
                  
                          int len = list.size();
                          int last = len - 1;
                          StringBuffer sb = new StringBuffer(2 * (len + 1));
                  
                          sb.append('{');
                  
                          for (int i = 0; i < len; i++) {
                              sb.append(list.get(i));
                  
                              if (i != last) {
                                  sb.append(',');
                              }
                          }
                  
                          sb.append('}');
                  
                          return sb.toString();
                      }
                  

                  【讨论】:

                    【解决方案12】:

                    Android 用户,可以使用以下:

                    TextUtils.join(",", getCollectionOfStrings());
                    

                    第二个参数将接受 Object[] 或 Iterable 类。

                    【讨论】:

                      【解决方案13】:

                      我知道已经很晚了,但我没有看到有人回复Java 8 way

                      String csvString = String.join(",", myStringList);
                      

                      【讨论】:

                        【解决方案14】:

                        想要转换List to String Java?让我们看看如何在 Java 中将元素的 Java Collections List 转换为 String。

                        Java 中的 List 基本上是有序集合或默认序列。

                        List 接受重复的元素,而 Map 不接受重复的值,并且还将对象保存在键值对中。

                        我们可以在调试代码时以可读的形式打印 List 元素的内容,这很有帮助。 从下面的 Java 程序中,让我们看看如何使用 toString 方法将 Java 列表转换为字符串数组。

                        我们使用 Arrays asList() 方法传递整数参数(数字)来创建 java 字符串数组。

                        换句话说,我们将整数列表作为数组传递给列表。 From below Java program, lets see how to convert Java list to string array using toString method.

                        【讨论】:

                        • 您好,我正在审核您的帖子。虽然是一个很好的答案,但添加一些代码以更好地帮助用户总是一个好主意。
                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 2013-07-18
                        • 2022-11-04
                        • 2019-11-30
                        • 2023-03-21
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多