我有List
的字符串。是否有Java便利方法將此List
轉換爲CSVString
?因此,「test1,test2,test3」是包含「test1」「test2」「test3」的一個List 3 String元素的轉換結果如何將列表<String>列表轉換爲csv字符串
已通過API?
我有List
的字符串。是否有Java便利方法將此List
轉換爲CSVString
?因此,「test1,test2,test3」是包含「test1」「test2」「test3」的一個List 3 String元素的轉換結果如何將列表<String>列表轉換爲csv字符串
已通過API?
Apache Commons Lang包含一個StringUtils.join()方法正是爲了這個目的。請注意,不同的風味存在。
而作爲2014年3月的,爪哇8現在有一個StringJoiner
我認爲,如果你想只使用Java核心,你可以使用以下。
java.util.Arrays.toString(list.toArray(new String[list.size()]).replace("[", "\"").replace("]", "\"");
警告:我沒有檢查過所有這些情況。 ;)
的Arrays.toString會如果列表中包含a, b, c
我們可以利用的事實,這是逗號分隔我們的優勢在這裏,只是去掉方括號中生成類似
[a], [b], [c]
在逗號在數據範圍內的情況下,用"
替換它們。如果你不需要這個,你可以做replace("[", ""
有一個番石榴類叫Joiner,可以很容易地創建這些類型的字符串。
做Joiner.on(",").join(yourStrings)
沒有,也沒有在JDK提供便捷的方法。你可以創建你自己的,但一般情況下這不是微不足道,因爲它似乎(例如,當一個字段包含一個分隔符,換行符,或textdelimiter):
實施例:
String[] fields = { "\n", ""he said \"hello\"", "," }
應該給你:
"
","he said ""hello""",","
編輯:這裏有一個建議RFC for CSV。編輯2:如果有人對某個實現感興趣,請發表評論,我有一個在家裏的硬盤上。
使用此代碼
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();
}
有在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
寫到這簡單的方法;
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();
}
如果列表爲空,這將會崩潰 –
我認爲這正是人們應該擁抱編寫良好的和調試過的庫的原因 –
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();
}
}
這是林做
@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);
}
如果您使用的是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);
釷是代碼處理包含引號,逗號和其他麻煩字符的數據:
公共類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(); } }
在天真的情況下,這將是足夠的,但如果字符串本身包含逗號它會失敗,引號或換行符。 –
@MarkoTopolnik - 同意 –
鏈接已死,也許http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#join(T ...)可能做一個好的替代品? –