Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions src/main/java/com/orangesignal/csv/CsvConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,11 @@ public class CsvConfig implements Serializable, Cloneable {
*/
private String lineSeparator = System.getProperty("line.separator");

/**
* 空文字の場合 null に置き換えるかどうかを保持します。
*/
private boolean emptyToNull;

// ------------------------------------------------------------------------
// コンストラクタ

Expand Down Expand Up @@ -678,6 +683,22 @@ public CsvConfig withVariableColumns(final boolean variableColumns) {
return this;
}

/**
* 空文字の場合 null に置き換えるかどうかを返します。
*
* @return 空文字の場合 null に置き換えるかどうか
* @since 2.2.2
*/
public boolean isEmptyToNull() { return emptyToNull; }

/**
* 空文字の場合 null に置き換えるかどうかを設定します。
*
* @param emptyToNull 空文字の場合 null に置き換えるかどうか
* @since 2.2.2
*/
public void setEmptyToNull(final boolean emptyToNull) { this.emptyToNull = emptyToNull; }

/**
* {@inheritDoc}
* @since 1.1
Expand Down
10 changes: 9 additions & 1 deletion src/main/java/com/orangesignal/csv/CsvReader.java
Original file line number Diff line number Diff line change
Expand Up @@ -405,10 +405,13 @@ private List<CsvToken> readCsvTokens() throws IOException {
if (arraySize == 1) {
if (endOfFile) {
final String value = results.get(0).getValue();
if (cfg.isIgnoreEmptyLines() && isWhitespaces(value)) {
if (cfg.isIgnoreEmptyLines() && (value == null || isWhitespaces(value))) {
return null;
}
if (cfg.getIgnoreLinePatterns() != null) {
if (value == null) {
return null;
}
for (final Pattern p : cfg.getIgnoreLinePatterns()) {
if (p != null && p.matcher(value).matches()) {
return null;
Expand Down Expand Up @@ -608,6 +611,11 @@ private CsvToken readCsvToken() throws IOException {
value = unescapeSeparator(value);
}
}
if (cfg.isEmptyToNull()) {
if (value == null || value.length() == 0) {
value = null;
}
}

return new SimpleCsvToken(value, startTokenLineNumber, endTokenLineNumber, enclosed);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,70 @@ public void testLoadFilterOffsetLimit() throws IOException {
}
}

@Test
public void testLoadNull() throws IOException {
final CsvConfig cfg = new CsvConfig(',', '"', '\\');
cfg.setNullString("NULL");
cfg.setBreakString("\n");
cfg.setIgnoreTrailingWhitespaces(true);
cfg.setIgnoreLeadingWhitespaces(true);
cfg.setIgnoreEmptyLines(true);
cfg.setIgnoreLinePatterns(Pattern.compile("^#.*$"));
cfg.setEmptyToNull(true);

final CsvReader reader = new CsvReader(new StringReader("# text/tab-separated-values \r\n aaa , \"b\r\nb\\\\b\" , \"c\\\"cc\" \r\n zzz , yyy , \r\n # Copyright 2009 OrangeSignal. "), cfg);
try {
final List<String[]> list = new StringArrayListHandler().load(reader);
assertThat(list.size(), is(2));

final String[] values1 = list.get(0);
assertThat(values1.length, is(3));
assertThat(values1[0], is("aaa"));
assertThat(values1[1], is("b\nb\\\\b"));
assertThat(values1[2], is("c\"cc"));

final String[] values2 = list.get(1);
assertThat(values2.length, is(3));
assertThat(values2[0], is("zzz"));
assertThat(values2[1], is("yyy"));
assertNull(values2[2]);
} finally {
reader.close();
}
}

@Test
public void testLoadNullEndOfFile() throws IOException {
final CsvConfig cfg = new CsvConfig(',', '"', '\\');
cfg.setNullString("NULL");
cfg.setBreakString("\n");
cfg.setIgnoreTrailingWhitespaces(true);
cfg.setIgnoreLeadingWhitespaces(true);
cfg.setIgnoreEmptyLines(true);
cfg.setIgnoreLinePatterns(Pattern.compile("^#.*$"));
cfg.setEmptyToNull(true);

final CsvReader reader = new CsvReader(new StringReader("# text/tab-separated-values \r\n aaa , \"b\r\nb\\\\b\" , \"c\\\"cc\" \r\n zzz , yyy , \r\n "), cfg);
try {
final List<String[]> list = new StringArrayListHandler().load(reader);
assertThat(list.size(), is(2));

final String[] values1 = list.get(0);
assertThat(values1.length, is(3));
assertThat(values1[0], is("aaa"));
assertThat(values1[1], is("b\nb\\\\b"));
assertThat(values1[2], is("c\"cc"));

final String[] values2 = list.get(1);
assertThat(values2.length, is(3));
assertThat(values2[0], is("zzz"));
assertThat(values2[1], is("yyy"));
assertNull(values2[2]);
} finally {
reader.close();
}
}

@Test
public void testSave() throws IOException {
final CsvConfig cfg = new CsvConfig(',', '"', '\\');
Expand Down