Ответ 1
Apache Commons Lang содержит метод StringUtils.join() именно для этой цели. Обратите внимание, что существуют различные ароматы.
И по состоянию на март 2014 года Java 8 теперь имеет StringJoiner
У меня есть List
строк. Есть ли метод удобства Java для преобразования этого List
в CSV String
? Таким образом, "test1, test2, test3" является результатом преобразования элементов String List 3, который содержит "test1" "test2" "test3"
Я мог написать сам метод для преобразования String
, но, возможно, это уже реализовано API?
Apache Commons Lang содержит метод StringUtils.join() именно для этой цели. Обратите внимание, что существуют различные ароматы.
И по состоянию на март 2014 года Java 8 теперь имеет StringJoiner
Если вы используете 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);
Существует класс Guava под названием Joiner, который может легко создавать такие строки.
Do Joiner.on(",").join(yourStrings)
В 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();
}
Я думаю, вы могли бы использовать следующее, если хотите просто использовать ядро Java.
java.util.Arrays.toString(list.toArray(new String[list.size()]).replace("[", "\"").replace("]", "\"");
Предупреждение: я не проверял все случаи этого.;)
Arrays.toString создаст что-то вроде
[a], [b], [c]
если в списке содержится a, b, c
Мы можем использовать тот факт, что он разделен запятой на наше преимущество здесь и просто удаляет квадратные скобки и заменяет их на "
для случая, когда запятые находятся внутри данных. Если вам это не нужно, вы можете просто сделать replace("[", ""
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();
}
}
Нет, в JDK нет удобного метода. Вы можете создать свой собственный, но для общего случая это не так тривиально, как кажется (например, когда поле содержит разделитель, символ новой строки или текстовый разделитель):
Пример:
String[] fields = { "\n", ""he said \"hello\"", "," }
должен предоставить вам следующее:
"
","he said ""hello""",","
EDIT: здесь предлагается RFC для CSV.
EDIT2: Если кто-то заинтересован в реализации, пожалуйста, оставьте комментарий, у меня есть одна жалость на моем жестком диске дома.
Это то, что я делаю
@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);
}
Этот код обрабатывает данные, содержащие кавычки, запятые и другие неприятные символы:
открытый класс 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(); } }
Используйте этот код
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();
}
Пользователи Android, вы можете использовать следующее:
TextUtils.join(",", getCollectionOfStrings());
Второй параметр будет принимать Object [] или класс Iterable.
Я знаю это довольно поздно, но я не вижу, чтобы кто-нибудь ответил с помощью Java 8 way:
String csvString = String.join(",", myStringList);