2012-11-16 21 views
13

Mam List z Ciągi. Czy istnieje wygodna metoda Java do konwersji tego List na CSV String? Tak więc "test1, test2, test3" jest wynikiem konwersji elementów listy 3, która zawiera "test1" "test2" "test3"Jak przekonwertować listę listy <String> do łańcucha CSV

Mogę napisać metodę samodzielnie, aby przekonwertować String, ale może to jest zaimplementowane przez API już?

Odpowiedz

27

Apache Commons Lang zawiera metodę StringUtils.join() dla tego celu. Zauważ, że istnieją różne smaki.

a od marca 2014 roku, Java 8 ma teraz StringJoiner

+7

W naiwnej razie to wystarczy, ale nie powiedzie się, jeśli struny same zawierają przecinki, cytaty lub znaki nowej linii. –

+0

@MarkoTopolnik - uzgodniono –

+0

Link jest martwy, może http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#join (T ...) mógłby być dobrym zamiennikiem? –

5

Myślę, że można użyć następujących jeśli chcesz po prostu użyć rdzenia Java.

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

Ostrzeżenie: Nie sprawdziłem wszystkich tych przypadków. ;)

Arrays.toString będzie produkować coś podobnego

[a], [b], [c] 

jeśli lista zawiera a, b, c

Możemy wykorzystać fakt, że jest oddzielone przecinkami na naszą korzyść tu i po prostu usuń nawiasy kwadratowe i zamień je na " dla przypadku, gdy przecinki znajdują się w danych. Jeśli tego nie potrzebujesz, możesz po prostu wykonać replace("[", ""

9

Istnieje klasa Guava o nazwie Joiner, która może z łatwością utworzyć tego rodzaju ciągi.

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

1

Nie istnieje żadna metoda wygoda dostępna w JDK. Można tworzyć własne, ale w ogólnym przypadku nie jest to tak trywialne, jak się wydaje (na przykład, gdy pole zawiera separator, znak nowej linii, lub textdelimiter):

  • pole conatins nowalinia: Pole musi przytoczyć
  • pole zawiera textdelimiter: ogranicznik jest podwojona
  • pole zawiera separator field musi być wymieniany

przykład:

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

powinno dać to:

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

EDIT: Oto proponowane RFC for CSV.

EDIT2: Jeśli ktoś jest zainteresowany wdrożeniem, proszę zostaw komentarz, mam go na swoim twardym dysku w domu.

0

użyć tego kodu

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

Wrote ten prosty sposób;

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

spowoduje to awarię, jeśli lista jest pusta –

+2

Myślę, że właśnie dlatego ludzie powinni korzystać z dobrze napisanych i debugowanych bibliotek –

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

To co robię

@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); 
    } 
1

Jeśli używasz Java 8

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

Z Strumienie

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

Th jest kod obsługuje dane zawierające cytaty, przecinki i inne znaki kłopotliwych:

public class 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(); 
} } 
Powiązane problemy