10 Aralık 2019 Salı

CSVPrinter Sınıfı - CVS Dosyası Oluşturur

Giriş
Şu satırı dahil ederiz. CVS dosyası yazmak/oluşturmak için kullanılır. withDelimeter() metodu ile ayraç belirtilir. withHeader() metodu ile varsa başlıklar belirtilir.
import org.apache.commons.csv.CSVFormat
import org.apache.commons.csv.CSVPrinter
constructor - File + CVSFormat
Şöyle yaparız.
final File out = new File(path);
try(CSVPrinter printer = new CSVPrinter(out, CSVFormat.DEFAULT
  .withDelimiter(' ')) {
  ...

}
constructor - 
Writer + CVSFormat
Örnek - Writer + CVSFormat.EXCEL
Şöyle yaparız.
String SAMPLE_CSV_FILE = "./sample.csv";

try (
  BufferedWriter writer = Files.newBufferedWriter(Paths.get(SAMPLE_CSV_FILE));
  CSVPrinter csvPrinter = new CSVPrinter(writer, CSVFormat.EXCEL
    .withHeader("ID", "Name", "Designation", "Company"));
) {
  csvPrinter.printRecord("1", "Name1 ", "CEO", "Google");
  csvPrinter.printRecord("2", "Name2", "CEO", "Microsoft");

  csvPrinter.flush();            
}
Örnek - Writer + CVSFormat.DEFAULT
Şöyle yaparız
try (var output = new ByteArrayOutputStream();
     var printer = new CSVPrinter(new OutputStreamWriter(output), CSVFormat.DEFAULT)) {
  ...
}
Örnek - Writer + CVSFormat.DEFAULT.withHeader
Elimizde şöyle bir kod olsun.
public enum Header
{
  FIRST_NAME(),
  LAST_NAME(),
  GENDER();
}
Şöyle yaparız.
try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(outputFile));
     CSVPrinter csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT.withHeader(
       Header.class));) {
...
} catch (IOException ex) {
...
}
Örnek - Writer + CVSFormat.DEFAULT.withHeader
Şöyle yaparız.
String SAMPLE_CSV_FILE = "./sample.csv";

try (
  BufferedWriter writer = Files.newBufferedWriter(Paths.get(SAMPLE_CSV_FILE));
  CSVPrinter csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT
    .withHeader("ID", "Name", "Designation", "Company"));
) {
  csvPrinter.printRecord("1", "...", "...");
  ...
}
flush metodu
Şöyle yaparız.
var printer = new CSVPrinter(...);
printer.flush();
toCharArray metodu
Şöyle yaparız.
CharArrayWriter writer = new CharArrayWriter()
CSVPrinter csvPrinter = new CSVPrinter(writer,
   CSVFormat.DEFAULT.withHeader("ID", "Name", "Designation", "Company"))
csvPrinter.printRecord("1", "Test", "Test", "Test")
csvPrinter.printRecord("2", "Test", "Test", "Test")
csvPrinter.printRecord("3", "Test", "Test", "Test")
csvPrinter.printRecord("4", "Test", "Test", "Test")
csvPrinter.flush()
response.outputStream << writer.toCharArray()
printRecord metodu - Object[]
İmzası şöyle
public void printRecord(final Object... values) throws IOException
Tek bir satır yazar.
Örnek
Şöyle yaparız.
csvPrinter.printRecord("1", "Name1 ", "CEO", "Google");
printRecord metodu - Iterable
İmzası şöyle
public void printRecord(final Iterable<?> values) throws IOException
Tek bir satır yazar.
Örnek - List<List<String>>
Şöyle yaparız
tring[] csvHeader = {"name", "surname", "age"};

List<List<String>> csvBody = new ArrayList<>();
csvBody.add(Arrays.asList("Patricia", "Williams", "25"));
csvBody.add(Arrays.asList("John", "Smith", "44"));
csvBody.add(Arrays.asList("Douglas", "Brown", "31"));

ByteArrayInputStream byteArrayOutputStream;

try (ByteArrayOutputStream out = new ByteArrayOutputStream();
     // defining the CSV printer
     CSVPrinter csvPrinter = new CSVPrinter(
       new PrintWriter(out),
       // withHeader is optional
       CSVFormat.DEFAULT.withHeader(csvHeader)
     );
) {
  // populating the CSV content
  for (List<String> record : csvBody)
     csvPrinter.printRecord(record);

  // writing the underlying stream
  csvPrinter.flush();

  byteArrayOutputStream = new ByteArrayInputStream(out.toByteArray());
} catch (IOException e) {
  ...
}
Örnek
Elimizde şöyle bir kod olsun.
public enum Header {
  FIRST_NAME(),
  LAST_NAME(),
  GENDER();
}
Elimizde şöyle bir kod olsun.
List<Map<Header, String>> output = new ArrayList<>();

Map<Header, String> map = new LinkedHashMap<>();
map.put(Header.FIRST_NAME, "John");
map.put(Header.LAST_NAME, "Andrew");
map.put(Header.GENDER, "Male");
output.add(map);
Şöyle yaparız.
for (Map<Header, String> val : output) {
  csvPrinter.printRecord(val.values().toArray());
}
Eğer LinkedHashMap yerine HashMap kullansaydık şöyle yaparız.
for (Map<Header, String> row : output) {
  csvPrinter.printRecord(Arrays.asList(Header.values()) //enumları sırayla dolaş
                               .stream()
                               .map(header -> row.get(header))
                               .collect(Collectors.toList()));
}
printRecords metodu - Iterable
İmzası şöyle
public void printRecords(final Iterable<?> values) throws IOException
public void printRecords(final Object... values) throws IOException
public void printRecords(final ResultSet resultSet) throws SQLException, IOException
public void printRecords(final ResultSet resultSet, final boolean printHeader)
  throws SQLException, IOException
Örnek
Şöyle yaparız
List<CSVRecord> csvRecords = ...;
BufferedWriter writer = ...;

CSVPrinter csvPrinter =
    new CSVPrinter(
        writer,
        CSVFormat.DEFAULT.withHeader(
            "Username",
            "Password",
            "Amount",
            "Timestamp"));
            
csvPrinter.printRecords(csvRecords);
csvPrinter.flush();
csvPrinter.close();

Hiç yorum yok:

Yorum Gönder