Подтвердить что ты не робот

Как преобразовать список List <String> в строку csv

У меня есть List строк. Есть ли метод удобства Java для преобразования этого List в CSV String? Таким образом, "test1, test2, test3" является результатом преобразования элементов String List 3, который содержит "test1" "test2" "test3"

Я мог написать сам метод для преобразования String, но, возможно, это уже реализовано API?

4b9b3361

Ответ 1

Apache Commons Lang содержит метод StringUtils.join() именно для этой цели. Обратите внимание, что существуют различные ароматы.

И по состоянию на март 2014 года Java 8 теперь имеет StringJoiner

Ответ 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

Существует класс Guava под названием Joiner, который может легко создавать такие строки.

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

Ответ 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

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();
    }
}

Ответ 8

Нет, в JDK нет удобного метода. Вы можете создать свой собственный, но для общего случая это не так тривиально, как кажется (например, когда поле содержит разделитель, символ новой строки или текстовый разделитель):

  • Поле conatins newline: поле должно быть указано Поле
  • содержит текстовый разделитель: разделитель удваивается Поле
  • содержит разделитель: поле должно быть указано

Пример:

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

должен предоставить вам следующее:

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

EDIT: здесь предлагается RFC для CSV.

EDIT2: Если кто-то заинтересован в реализации, пожалуйста, оставьте комментарий, у меня есть одна жалость на моем жестком диске дома.

Ответ 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);
    }

Ответ 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);