diff --git a/JavaCSV-Reloaded/src/main/com/csvreader/CsvWriter.java b/JavaCSV-Reloaded/src/main/com/csvreader/CsvWriter.java index 294413b..cd05d42 100644 --- a/JavaCSV-Reloaded/src/main/com/csvreader/CsvWriter.java +++ b/JavaCSV-Reloaded/src/main/com/csvreader/CsvWriter.java @@ -1,7 +1,7 @@ /* * Java CSV is a stream based library for reading and writing * CSV and other delimited data. - * + * * Copyright (C) Bruce Dunwiddie bruce@csvreader.com * * This library is free software; you can redistribute it and/or @@ -20,11 +20,11 @@ */ package main.com.csvreader; +import java.io.BufferedWriter; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; -import java.io.BufferedWriter; import java.io.Writer; import java.nio.charset.Charset; @@ -33,7 +33,7 @@ */ public class CsvWriter { private Writer outputStream = null; - + private String fileName = null; private boolean firstColumn = true; @@ -48,7 +48,7 @@ public class CsvWriter { private boolean initialized = false; private boolean closed = false; - + private String systemRecordDelimiter = System.getProperty("line.separator"); /** @@ -155,7 +155,7 @@ public void setDelimiter(char delimiter) { userSettings.Delimiter = delimiter; } - public char getRecordDelimiter() { + public String getRecordDelimiter() { return userSettings.RecordDelimiter; } @@ -164,10 +164,33 @@ public char getRecordDelimiter() { * * @param recordDelimiter * The character to use as the record delimiter. Default is - * combination of standard end of line characters for Windows, - * Unix, or Mac. + * the operative system native line separator. + * + *

Note this method does not allow you to set the Windows + * native line separator as it is composed of 2 characters: + * {@code \r\n}. If you need to set this separator (e.g.: if you + * are in a Unix based operative system and need to output for + * Windows) then you will have to use + * {@link #setRecordDelimiter(String)}.

+ * + *

This method was kept for compatibility with previous + * versions.

*/ public void setRecordDelimiter(char recordDelimiter) { + setRecordDelimiter(String.valueOf(recordDelimiter)); + } + + /** + * Sets the character to use as the record delimiter. + * + * @param recordDelimiter + * The {@code String} to use as the record delimiter. Default is + * the operative system native line separator. + * + *

This method was added in version 2.2 and allows the + * delimiter to be a {@code String}.

+ */ + public void setRecordDelimiter(String recordDelimiter) { useCustomRecordDelimiter = true; userSettings.RecordDelimiter = recordDelimiter; } @@ -287,13 +310,13 @@ public void write(String content, boolean preserveSpaces) || (!useCustomRecordDelimiter && (content .indexOf(Letters.LF) > -1 || content .indexOf(Letters.CR) > -1)) - || (useCustomRecordDelimiter && content - .indexOf(userSettings.RecordDelimiter) > -1) - || (firstColumn && content.length() > 0 && content - .charAt(0) == userSettings.Comment) || - // check for empty first column, which if on its own line must - // be qualified or the line will be skipped - (firstColumn && content.length() == 0))) { + || (useCustomRecordDelimiter && content + .indexOf(userSettings.RecordDelimiter) > -1) + || (firstColumn && content.length() > 0 && content + .charAt(0) == userSettings.Comment) || + // check for empty first column, which if on its own line must + // be qualified or the line will be skipped + (firstColumn && content.length() == 0))) { textQualify = true; } @@ -334,8 +357,8 @@ public void write(String content, boolean preserveSpaces) + Letters.BACKSLASH + userSettings.Delimiter); if (useCustomRecordDelimiter) { - content = replace(content, "" + userSettings.RecordDelimiter, - "" + Letters.BACKSLASH + userSettings.RecordDelimiter); + content = replace(content, userSettings.RecordDelimiter, + Letters.BACKSLASH + userSettings.RecordDelimiter); } else { content = replace(content, "" + Letters.CR, "" + Letters.BACKSLASH + Letters.CR); @@ -391,7 +414,7 @@ public void writeComment(String commentText) throws IOException { } else { outputStream.write(systemRecordDelimiter); } - + firstColumn = true; } @@ -412,8 +435,8 @@ public void writeComment(String commentText) throws IOException { public void writeRecord(String[] values, boolean preserveSpaces) throws IOException { if (values != null && values.length > 0) { - for (int i = 0; i < values.length; i++) { - write(values[i], preserveSpaces); + for (String value : values) { + write(value, preserveSpaces); } endRecord(); @@ -474,7 +497,7 @@ private void checkInit() throws IOException { * be written to the underlying device. * @exception IOException * Thrown if an error occurs while writing data to the - * destination stream. + * destination stream. */ public void flush() throws IOException { outputStream.flush(); @@ -520,7 +543,7 @@ private void close(boolean closing) { private void checkClosed() throws IOException { if (closed) { throw new IOException( - "This instance of the CsvWriter class has already been closed."); + "This instance of the CsvWriter class has already been closed."); } } @@ -549,6 +572,7 @@ private class Letters { public static final char BACKSLASH = '\\'; public static final char NULL = '\0'; + } private class UserSettings { @@ -560,7 +584,7 @@ private class UserSettings { public char Delimiter; - public char RecordDelimiter; + public String RecordDelimiter; public char Comment; @@ -572,7 +596,7 @@ public UserSettings() { TextQualifier = Letters.QUOTE; UseTextQualifier = true; Delimiter = Letters.COMMA; - RecordDelimiter = Letters.NULL; + RecordDelimiter = String.valueOf(Letters.NULL); Comment = Letters.POUND; EscapeMode = ESCAPE_MODE_DOUBLED; ForceQualifier = false; diff --git a/JavaCSV-Reloaded/src/test/com/csvreader/AllTests.java b/JavaCSV-Reloaded/src/test/com/csvreader/AllTests.java index f1db7b2..f5a2a48 100644 --- a/JavaCSV-Reloaded/src/test/com/csvreader/AllTests.java +++ b/JavaCSV-Reloaded/src/test/com/csvreader/AllTests.java @@ -1,5 +1,4 @@ package test.com.csvreader; - /* * Java CSV is a stream based library for reading and writing * CSV and other delimited data. @@ -1176,6 +1175,7 @@ public void test52() throws Exception { @Test public void test54() throws Exception { byte[] buffer; + final String systemLineSeparator = System.getProperty("line.separator"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); CsvWriter writer = new CsvWriter(stream, ',', Charset @@ -1197,10 +1197,9 @@ public void test54() throws Exception { String data = Charset.forName("ISO-8859-1").decode( ByteBuffer.wrap(buffer)).toString(); - Assert .assertEquals( - "\"1,2\",3,\"blah \"\"some stuff in quotes\"\"\"\r\n\"1,2\",\"3\",\"blah \"\"some stuff in quotes\"\"\"", + "\"1,2\",3,\"blah \"\"some stuff in quotes\"\"\"" + systemLineSeparator + "\"1,2\",\"3\",\"blah \"\"some stuff in quotes\"\"\"", data); } @@ -1227,6 +1226,7 @@ public void test55() throws Exception { @Test public void test56() throws Exception { byte[] buffer; + final String systemLineSeparator = System.getProperty("line.separator"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); CsvWriter writer = new CsvWriter(stream, '\t', Charset @@ -1244,12 +1244,13 @@ public void test56() throws Exception { ByteBuffer.wrap(buffer)).toString(); Assert.assertEquals( - "1,2\t3\t\"blah \"\"some stuff in quotes\"\"\"\r\n", data); + "1,2\t3\t\"blah \"\"some stuff in quotes\"\"\"" + systemLineSeparator, data); } @Test public void test57() throws Exception { byte[] buffer; + final String systemLineSeparator = System.getProperty("line.separator"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); CsvWriter writer = new CsvWriter(stream, '\t', Charset @@ -1269,12 +1270,13 @@ public void test57() throws Exception { String data = Charset.forName("ISO-8859-1").decode( ByteBuffer.wrap(buffer)).toString(); - Assert.assertEquals("1,2\t3\tblah \"some stuff in quotes\"\r\n", data); + Assert.assertEquals("1,2\t3\tblah \"some stuff in quotes\"" + systemLineSeparator, data); } @Test public void test58() throws Exception { byte[] buffer; + final String systemLineSeparator = System.getProperty("line.separator"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); CsvWriter writer = new CsvWriter(stream, '\t', Charset @@ -1292,7 +1294,7 @@ public void test58() throws Exception { String data = Charset.forName("ISO-8859-1").decode( ByteBuffer.wrap(buffer)).toString(); - Assert.assertEquals("\"data\r\nmore data\"\t3\t3\t\" 3\t\"\r\n", data); + Assert.assertEquals("\"data\r\nmore data\"\t3\t3\t\" 3\t\"" + systemLineSeparator, data); } @Test @@ -1324,6 +1326,7 @@ public void test70() throws Exception { @Test public void test71() throws Exception { byte[] buffer; + final String systemLineSeparator = System.getProperty("line.separator"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); CsvWriter writer = new CsvWriter(stream, ',', Charset @@ -1339,7 +1342,7 @@ public void test71() throws Exception { String data = Charset.forName("ISO-8859-1").decode( ByteBuffer.wrap(buffer)).toString(); - Assert.assertEquals("\"data\"\r\n", data); + Assert.assertEquals("\"data\"" + systemLineSeparator, data); } @Test @@ -1349,9 +1352,9 @@ public void test72() throws Exception { ByteArrayOutputStream stream = new ByteArrayOutputStream(); CsvWriter writer = new CsvWriter(stream, ',', Charset .forName("ISO-8859-1")); - Assert.assertEquals('\0', writer.getRecordDelimiter()); - writer.setRecordDelimiter(';'); - Assert.assertEquals(';', writer.getRecordDelimiter()); + Assert.assertEquals("\0", writer.getRecordDelimiter()); + writer.setRecordDelimiter(";"); + Assert.assertEquals(";", writer.getRecordDelimiter()); writer.write("a;b"); writer.endRecord(); writer.close(); @@ -1368,6 +1371,7 @@ public void test72() throws Exception { @Test public void test73() throws Exception { byte[] buffer; + final String systemLineSeparator = System.getProperty("line.separator"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); CsvWriter writer = new CsvWriter(stream, ',', Charset @@ -1394,13 +1398,14 @@ public void test73() throws Exception { ByteBuffer.wrap(buffer)).toString(); Assert .assertEquals( - "\"1,2\",3,\"blah \\\"some stuff in quotes\\\"\"\r\n\"1,2\",\"3\",\"blah \\\"some stuff in quotes\\\"\"", + "\"1,2\",3,\"blah \\\"some stuff in quotes\\\"\""+ systemLineSeparator +"\"1,2\",\"3\",\"blah \\\"some stuff in quotes\\\"\"", data); } @Test public void test74() throws Exception { byte[] buffer; + final String systemLineSeparator = System.getProperty("line.separator"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); CsvWriter writer = new CsvWriter(stream, ',', Charset @@ -1418,12 +1423,13 @@ public void test74() throws Exception { String data = Charset.forName("ISO-8859-1").decode( ByteBuffer.wrap(buffer)).toString(); - Assert.assertEquals("1\\,2,3,blah \"some stuff in quotes\"\r\n", data); + Assert.assertEquals("1\\,2,3,blah \"some stuff in quotes\"" + systemLineSeparator, data); } @Test public void test75() throws Exception { byte[] buffer; + final String systemLineSeparator = System.getProperty("line.separator"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); CsvWriter writer = new CsvWriter(stream, ',', Charset @@ -1440,7 +1446,7 @@ public void test75() throws Exception { String data = Charset.forName("ISO-8859-1").decode( ByteBuffer.wrap(buffer)).toString(); - Assert.assertEquals("1\r\n#blah\r\n2\r\n", data); + Assert.assertEquals("1" + systemLineSeparator + "#blah" + systemLineSeparator + "2" + systemLineSeparator, data); } @Test @@ -1720,7 +1726,7 @@ public void test117() throws Exception { writer.setComment('~'); Assert.assertEquals('~', writer.getComment()); - writer.setRecordDelimiter(';'); + writer.setRecordDelimiter(";"); writer.write("1"); writer.endRecord(); @@ -1740,6 +1746,7 @@ public void test117() throws Exception { @Test public void test118() throws Exception { byte[] buffer; + final String systemLineSeparator = System.getProperty("line.separator"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); CsvWriter writer = new CsvWriter(stream, '\t', Charset @@ -1763,13 +1770,14 @@ public void test118() throws Exception { Assert .assertEquals( - "1,2\t3\tblah \"some stuff in quotes\"\t\'blah \'\'some stuff in quotes\'\'\'\r\n", + "1,2\t3\tblah \"some stuff in quotes\"\t\'blah \'\'some stuff in quotes\'\'\'" + systemLineSeparator, data); } @Test public void test119() throws Exception { byte[] buffer; + final String systemLineSeparator = System.getProperty("line.separator"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); CsvWriter writer = new CsvWriter(stream, ',', Charset @@ -1793,12 +1801,13 @@ public void test119() throws Exception { String data = Charset.forName("ISO-8859-1").decode( ByteBuffer.wrap(buffer)).toString(); - Assert.assertEquals("\"1,2\",3\r\n1,2\t3\r\n", data); + Assert.assertEquals("\"1,2\",3" + systemLineSeparator + "1,2\t3" + systemLineSeparator, data); } @Test public void test120() throws Exception { byte[] buffer; + final String systemLineSeparator = System.getProperty("line.separator"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); CsvWriter writer = new CsvWriter(stream, ',', Charset @@ -1817,13 +1826,14 @@ public void test120() throws Exception { stream.close(); data = Charset.forName("ISO-8859-1").decode(ByteBuffer.wrap(buffer)) .toString(); - Assert.assertEquals("\"1,2\"\r\n", data); + Assert.assertEquals("\"1,2\"" + systemLineSeparator, data); writer.close(); } @Test public void test121() throws Exception { byte[] buffer; + final String systemLineSeparator = System.getProperty("line.separator"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); CsvWriter writer = new CsvWriter(stream, ',', Charset @@ -1840,12 +1850,13 @@ public void test121() throws Exception { String data = Charset.forName("ISO-8859-1").decode( ByteBuffer.wrap(buffer)).toString(); - Assert.assertEquals("1,2\r\n1,2\r\n\" 1 \",2\r\n", data); + Assert.assertEquals("1,2" + systemLineSeparator + "1,2" + systemLineSeparator + "\" 1 \",2" + systemLineSeparator, data); } @Test public void test122() throws Exception { byte[] buffer; + final String systemLineSeparator = System.getProperty("line.separator"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); CsvWriter writer = new CsvWriter(stream, ',', Charset @@ -1862,12 +1873,13 @@ public void test122() throws Exception { String data = Charset.forName("ISO-8859-1").decode( ByteBuffer.wrap(buffer)).toString(); - Assert.assertEquals("\"1,2\",,\"3 \"\r\n", data); + Assert.assertEquals("\"1,2\",,\"3 \"" + systemLineSeparator, data); } @Test public void test123() throws Exception { byte[] buffer; + final String systemLineSeparator = System.getProperty("line.separator"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); CsvWriter writer = new CsvWriter(stream, ',', Charset @@ -1890,8 +1902,7 @@ public void test123() throws Exception { String data = Charset.forName("ISO-8859-1").decode( ByteBuffer.wrap(buffer)).toString(); - - Assert.assertEquals("\"#123\"\r\n\\#123\r\n\\#\r\n", data); + Assert.assertEquals("\"#123\"" + systemLineSeparator + "\\#123" + systemLineSeparator + "\\#" + systemLineSeparator, data); } @Test @@ -1901,7 +1912,7 @@ public void test124() throws Exception { ByteArrayOutputStream stream = new ByteArrayOutputStream(); CsvWriter writer = new CsvWriter(stream, ',', Charset .forName("ISO-8859-1")); - writer.setRecordDelimiter(';'); + writer.setRecordDelimiter(";"); writer.setUseTextQualifier(false); writer.setEscapeMode(CsvWriter.ESCAPE_MODE_BACKSLASH); @@ -1921,6 +1932,7 @@ public void test124() throws Exception { @Test public void test131() throws Exception { byte[] buffer; + final String systemLineSeparator = System.getProperty("line.separator"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); CsvWriter writer = new CsvWriter(stream, ',', Charset @@ -1931,7 +1943,7 @@ public void test131() throws Exception { writer.write("1,\\\r\n2"); writer.endRecord(); - writer.setRecordDelimiter(';'); + writer.setRecordDelimiter(";"); writer.write("1,\\;2"); writer.endRecord(); @@ -1943,12 +1955,13 @@ public void test131() throws Exception { String data = Charset.forName("ISO-8859-1").decode( ByteBuffer.wrap(buffer)).toString(); - Assert.assertEquals("1\\,\\\\\\\r\\\n2\r\n1\\,\\\\\\;2;", data); + Assert.assertEquals("1\\,\\\\\\\r\\\n2" + systemLineSeparator + "1\\,\\\\\\;2;", data); } @Test public void test132() throws Exception { byte[] buffer; + final String systemLineSeparator = System.getProperty("line.separator"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); CsvWriter writer = new CsvWriter(stream, ',', Charset @@ -1965,7 +1978,7 @@ public void test132() throws Exception { String data = Charset.forName("ISO-8859-1").decode( ByteBuffer.wrap(buffer)).toString(); - Assert.assertEquals("\"1,\\\\2\"\r\n", data); + Assert.assertEquals("\"1,\\\\2\"" + systemLineSeparator, data); } @Test @@ -2262,4 +2275,104 @@ public void Test174() throws IOException { new File("temp.csv").delete(); } -} + + @Test + public void test175() throws Exception { + byte[] buffer; + + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + CsvWriter writer = new CsvWriter(stream, ',', Charset + .forName("ISO-8859-1")); + Assert.assertEquals("\0", writer.getRecordDelimiter()); + writer.setRecordDelimiter("\r\n"); + Assert.assertEquals("\r\n", writer.getRecordDelimiter()); + writer.write("test line number 1"); + writer.endRecord(); + writer.write("test line number 2"); + writer.endRecord(); + writer.close(); + + buffer = stream.toByteArray(); + stream.close(); + + String data = Charset.forName("ISO-8859-1").decode( + ByteBuffer.wrap(buffer)).toString(); + + Assert.assertEquals("test line number 1\r\ntest line number 2\r\n", data); + } + + @Test + public void test176() throws Exception { + byte[] buffer; + + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + CsvWriter writer = new CsvWriter(stream, ',', Charset + .forName("ISO-8859-1")); + Assert.assertEquals("\0", writer.getRecordDelimiter()); + writer.setRecordDelimiter("\r\n"); + writer.setForceQualifier(true); + Assert.assertEquals("\r\n", writer.getRecordDelimiter()); + writer.write("line 1 and column 1"); + writer.write("line 1 and column 2"); + writer.endRecord(); + writer.write("line 2 and column 1"); + writer.write("line 2 and column 2"); + writer.endRecord(); + writer.close(); + + buffer = stream.toByteArray(); + stream.close(); + + String data = Charset.forName("ISO-8859-1").decode( + ByteBuffer.wrap(buffer)).toString(); + + Assert.assertEquals("\"line 1 and column 1\",\"line 1 and column 2\"\r\n\"line 2 and column 1\",\"line 2 and column 2\"\r\n", data); + } + + @Test + public void test177() throws Exception { + byte[] buffer; + + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + CsvWriter writer = new CsvWriter(stream, ',', Charset + .forName("ISO-8859-1")); + Assert.assertEquals("\0", writer.getRecordDelimiter()); + writer.setRecordDelimiter("\r\n"); + Assert.assertEquals("\r\n", writer.getRecordDelimiter()); + writer.write("a\r\nb"); + writer.endRecord(); + writer.close(); + + buffer = stream.toByteArray(); + stream.close(); + + String data = Charset.forName("ISO-8859-1").decode( + ByteBuffer.wrap(buffer)).toString(); + + Assert.assertEquals("\"a\r\nb\"\r\n", data); + } + + @Test + public void test178() throws Exception { + byte[] buffer; + + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + CsvWriter writer = new CsvWriter(stream, ',', Charset + .forName("ISO-8859-1")); + Assert.assertEquals("\0", writer.getRecordDelimiter()); + writer.setRecordDelimiter("\r\n"); + writer.setForceQualifier(true); + Assert.assertEquals("\r\n", writer.getRecordDelimiter()); + writer.write("a\r\nb"); + writer.endRecord(); + writer.close(); + + buffer = stream.toByteArray(); + stream.close(); + + String data = Charset.forName("ISO-8859-1").decode( + ByteBuffer.wrap(buffer)).toString(); + + Assert.assertEquals("\"a\r\nb\"\r\n", data); + } +} \ No newline at end of file