Skip to content

Instantly share code, notes, and snippets.

@cattaka
Last active October 6, 2016 02:10
Show Gist options
  • Save cattaka/3376e1275af688f16e67d42fa6ad25d1 to your computer and use it in GitHub Desktop.
Save cattaka/3376e1275af688f16e67d42fa6ad25d1 to your computer and use it in GitHub Desktop.
Split and Join function for strings such as CSV, TSV
public class StringUtilsTest {
@Test
public void testSplit() {
assertThat(StringUtils.split(null, ',', '"'), is(Collections.EMPTY_LIST));
assertThat(StringUtils.split("", ',', '"'), is(Collections.<String>singletonList(null)));
assertThat(StringUtils.split("\"\"", ',', '"'), is(Collections.singletonList("")));
assertThat(StringUtils.split("\"\",,\"\"", ',', '"'), is(Arrays.asList("", null, "")));
assertThat(StringUtils.split("a,b,c", ',', '"'), is(Arrays.asList("a", "b", "c")));
assertThat(StringUtils.split("a\"b,c", ',', '"'), is(Arrays.asList("a\"b", "c")));
assertThat(StringUtils.split("\"a\"\"b\",c", ',', '"'), is(Arrays.asList("a\"b", "c")));
assertThat(StringUtils.split("\"a,b\",c", ',', '"'), is(Arrays.asList("a,b", "c")));
}
@Test
public void testJoin() {
assertThat(StringUtils.join(null, ',', '"'), is(nullValue()));
assertThat(StringUtils.join(Collections.<String>emptyList(), ',', '"'), is(nullValue()));
assertThat(StringUtils.join(Collections.<String>singletonList(null), ',', '"'), is(""));
assertThat(StringUtils.join(Collections.singletonList(""), ',', '"'), is("\"\""));
assertThat(StringUtils.join(Arrays.asList("", null, ""), ',', '"'), is("\"\",,\"\""));
assertThat(StringUtils.join(Arrays.asList("a", "b", "c"), ',', '"'), is("a,b,c"));
assertThat(StringUtils.join(Arrays.asList("a\"b", "c"), ',', '"'), is("\"a\"\"b\",c"));
assertThat(StringUtils.join(Arrays.asList("a,b", "c"), ',', '"'), is("\"a,b\",c"));
}
}
public class StringUtils {
public static List<String> split(String src, char delim, char bracket) {
ArrayList<String> result = new ArrayList<>();
if (src == null) {
return result;
}
StringBuilder sb = new StringBuilder();
int mode = 0;
for (int i = 0; i <= src.length(); i++) {
char ch = (i < src.length()) ? src.charAt(i) : delim;
switch (mode) {
case 0:
if (ch == delim) {
if (sb.length() == 0) {
result.add(null);
} else {
result.add(sb.toString());
}
sb.delete(0, sb.length());
} else if (ch == bracket) {
mode = 1;
} else {
sb.append(ch);
mode = 3;
}
break;
case 1:
if (ch == delim) {
sb.append(ch);
} else if (ch == bracket) {
mode = 2;
} else {
sb.append(ch);
}
break;
case 2:
if (ch == delim) {
result.add(sb.toString());
sb.delete(0, sb.length());
mode = 0;
} else if (ch == bracket) {
sb.append(ch);
mode = 1;
} else {
// Error case
sb.append(delim);
sb.append(ch);
mode = 1;
}
break;
case 3:
if (ch == delim) {
result.add(sb.toString());
sb.delete(0, sb.length());
mode = 0;
} else if (ch == bracket) {
sb.append(ch);
} else {
sb.append(ch);
}
break;
default:
throw new RuntimeException("ERROR");
}
}
return result;
}
public static String join(List<String> src, char delim, char bracket) {
if (src == null || src.size() == 0) {
return null;
}
String bracketStr = "" + bracket;
String bracketStr2 = "" + bracket + bracket;
StringBuilder sb = new StringBuilder();
boolean first = true;
for (String s : src) {
if (first) {
first = false;
} else {
sb.append(delim);
}
if (s == null) {
// none
} else if (s.length() == 0) {
sb.append(bracket);
sb.append(bracket);
} else if (s.indexOf(delim) != -1 || s.indexOf(bracket) != -1) {
sb.append(bracket);
sb.append(s.replace(bracketStr, bracketStr2));
sb.append(bracket);
} else {
sb.append(s);
}
}
return sb.toString();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment