关于Java:如何将List <String>列表转换为csv字符串

How to convert a List<String> list to csv string

我有一个List的字符串。是否存在Java便捷方法将List转换为CSV String?因此," test1,test2,test3"是包含" test1"," test2"," test3"

的列表3字符串元素的转换结果。

我可以自己编写用于转换String的方法,但是也许已经由API实现了吗?


Apache Commons Lang包含一个StringUtils.join()方法。请注意,存在不同的口味。

自2014年3月起,Java 8现在具有StringJoiner


如果您使用的是Java 8

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

使用流

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

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

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


编写这种简单的方法;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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();
}


org.springframework.util.StringUtils中有一些有用的方法。

示例:

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

有关更多详细信息:
http://static.springsource.org/spring/docs/1.2.9/api/org/springframework/util/StringUtils.html


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

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

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

Arrays.toString将产生类似

的内容

1
[a], [b], [c]

如果您的列表包含a, b, c

在这里我们可以利用逗号分隔这一事实来为我们提供好处,对于逗号在数据内的情况,只需删除方括号并将其替换为"即可。如果您不需要此功能,则可以执行replace("[",""


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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();
    }
}

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

public class ToCsv {

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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();
} }

这就是我在做什么

1
2
3
4
5
6
7
  @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);
    }


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

  • 字段换行符:字段必须用引号引起来
  • 字段包含textdelimiter:分隔符加倍
  • 字段包含分隔符:字段必须用引号引起来

示例:

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

应该给你这个:

1
2
"
"
,"he said""hello""",","

编辑:这是CSV的建议RFC。

EDIT2:万一有人对实现感兴趣,请在评论中说,我在家中的硬盘上有个麻烦。


我知道已经很晚了,但是我看不到有人用Java 8方式回答过:

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

Android用户,可以使用以下内容:

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

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


使用此代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 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();
    }

想要将List转换为String Java吗?让我们看一下如何在Java中将元素的Java Collections列表转换为String。

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

List接受重复元素,而Map不接受重复值,并且也将对象保存为键值对。

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

我们正在传递整数参数(数字)以使用Arrays asList()方法创建Java字符串数组。

换句话说,我们将整数列表作为数组传递给list。
从下面的Java程序中,让我们看看如何使用toString方法将Java列表转换为字符串数组。