10 Temmuz 2019 Çarşamba

CSVFormat Sınıfı - CVS Dosyasının Formatını Belirtilir

Giriş
Şu satırı dahil ederiz.
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import org.apache.commons.csv.QuoteMode;
Kullanım - Okuma
Bu sınıf CSVParser sınıfının constructor metodun parametre olarak geçilirse, veriyi formatlar.
Örnek
Şöyle yaparız
try (CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT)) {

  List<CSVRecord> csvRecords = csvParser.getRecords();
  ...
} catch (IOException e){
  ...
}
Kullanım - Yazma
Bu sınıf CSVPrinter sınıfının constructor metodun parametre olarak geçilirse, veriyi formatla

DEFAULT Alanı
Örnek ver

EXCEL Alanı
Örnek ver

parse metodu
Şöyle yaparız.
final FileReader fr = ..
final Iterable<CSVRecord> records = CSVFormat.DEFAULT.withDelimiter(' ').parse(fr);
for (final CSVRecord record : records) { 
  ...
}
RFC4180 Alanı
DEFAULT ile farkı şöyle
DEFAULT                               RFC4180                       Comment
===================================   ===========================   ========================
withDelimiter(',')                    withDelimiter(',')            Same
withQuote('"')                        withQuote('"')                Same
withRecordSeparator("\r\n")           withRecordSeparator("\r\n")   Same
withIgnoreEmptyLines(true)            withIgnoreEmptyLines(false)   Don't ignore blank lines
withAllowDuplicateHeaderNames(true)   -                             Don't allow duplicates
===================================   ===========================   ========================
                                      withFirstRecordAsHeader()     
RFC4180 standardında son satır isteğe bağlıdır, ancak diğer satırlar CR/LF ile biter. Şöyledir
aaa,bbb,ccc CRLF
zzz,yyy,xxx
RFC4180 standardında field değerinde double quote varsa field double quote ile escape edilir. Açıklaması şöyle
Each field may or may not be enclosed in double quotes (however some programs, such as Microsoft Excel, do not use double quotes at all). If fields are not enclosed with double quotes, then double quotes may not appear inside the fields.
RFC4180 standardında field değerinde CR/LF varsa double quote ile escape edilir. Şöyledir. Burada iki satır var.
"aaa","b CRLF
bb","ccc" CRLF
zzz,yyy,xxx
Örnek
Elimizde şöyle bir veri olsun
id,first,last,city
1,john,doe,austin
2,jane,mary,seattle
Şöyle yaparız
CSVFormat csvFormat = CSVFormat.RFC4180.withFirstRecordAsHeader();
withAllowMissionColumnNames metodu
Şöyle yaparız
Reader reader = new InputStreamReader(in);
try {
  CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT
    .withFirstRecordAsHeader().withIgnoreHeaderCase().withTrim()
    .withAllowMissingColumnNames());
  ...
} catch (IOException e) {
  ...
}
withFirstRecordAsHeader metodu
Şöyle yaparız
private static final String CSV_FILE_PATH = "C:Test Data\\names.csv";

try (
  Reader reader = Files.newBufferedReader(Paths.get(CSV_FILE_PATH));
  CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT
    .withFirstRecordAsHeader()
    .withIgnoreHeaderCase()
    .withTrim());
) {
  ...
}
withEscape metodu
Örnek
Şöyle yaparız.
Reader reader = ...;
CSVParser csvParser = null;
try {
  csvParser = new CSVParser(reader, CSVFormat.DEFAULT
    .withEscape('/')
    .withFirstRecordAsHeader()
    .withDelimiter('|')
    .withIgnoreHeaderCase()
    .withTrim());
  ...
} finally {
  ...
}
withHeader metodu
Örnek
Şöyle yaparız.
BufferedReader reader = Files.newBufferedReader(Paths.get("przedmioty.csv"));

CSVParser csvParser = new CSVParser(reader,
  CSVFormat.DEFAULT.withHeader("Name", "Teacher", "Years")
    .withIgnoreHeaderCase()
    .withTrim());

for (CSVRecord csvRecord: csvParser) {
  ...
}
withQuoteMode metodu
QuoteMode.NONE için açıklama şöyle. Yani hiç bir şeyi escape etmez
Never quotes fields. When the delimiter occurs in data, the printer prefixes it with the escape character. If the escape character is not set, format validation throws an exception.

QuoteMode.MINIMAL için açıklama şöyle. Yani bir alan içinde escape edilmesi gereken veri varsa sadece o alanı escap eder
Quotes fields which contain special characters such as a the field delimiter, quote character or any of the characters in the line separator string.
Örnek
Şöyle yaparız
StringBuilder out = new StringBuilder();
try (CSVPrinter csvPrinter = new CSVPrinter(out,
  CSVFormat.DEFAULT
    .withHeader("AAAA", "BB\"BB", "CC,CC", "DD'DD")
    .withDelimiter(',')
    .withEscape('\\') // <- maybe you want '"' instead
    .withQuote('"').withRecordSeparator('\n').withTrim()
    .withQuoteMode(QuoteMode.MINIMAL)
)) {
  csvPrinter.printRecord("WWWW", "XX\"XX", "YY,YY", "ZZ'ZZ");
}
System.out.println(out);
Çıktı olarak şunu alırız
AAAA,"BB\"BB","CC,CC",DD'DD
WWWW,"XX\"XX","YY,YY",ZZ'ZZ
Eğer escape karakterini değiştirirsek
StringBuilder out = new StringBuilder();
try (CSVPrinter csvPrinter = new CSVPrinter(out,
  CSVFormat.DEFAULT
    .withHeader("AAAA", "BB\"BB", "CC,CC", "\"DD\"", "1")
    .withDelimiter(',')
    .withEscape('"')
    .withQuote('"').withRecordSeparator('\n').withTrim()
    .withQuoteMode(QuoteMode.MINIMAL)
)) {
  csvPrinter.printRecord("WWWW", "XX\"XX", "YY,YY", "\"DD\"", "2");
}
System.out.println(out);
Çıktı olarak şunu alırız
AAAA,"BB""BB","CC,CC","""DD""",1
WWWW,"XX""XX","YY,YY","""DD""",2

Örnek
Şöyle yaparız.
CSVFormat csvFormat = CSVFormat.EXCEL
            .withQuoteMode(QuoteMode.MINIMAL);

BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));
CSVPrinter csvPrinter = new CSVPrinter(writer, csvFormat);
csvPrinter.printRecord("eggs", "foo bar   ", "spam");
csvPrinter.flush();
csvPrinter.close();
QuoteMode.ALL
Her şeyi withEscape() ile belirtilen karaktler escape eder
Örnek
Şöyle yaparız
StringBuilder out = new StringBuilder();
try (CSVPrinter csvPrinter = new CSVPrinter(out,
        CSVFormat.DEFAULT
                .withHeader("AAAA", "BB\"BB", "CC,CC", "\"DD\"", "1")
                .withDelimiter(',')
                .withEscape('"')
                .withQuote('"').withRecordSeparator('\n').withTrim()
                .withQuoteMode(QuoteMode.ALL)
)) {
    csvPrinter.printRecord("WWWW", "XX\"XX", "YY,YY", "\"DD\"", "2");
}
System.out.println(out);
Çıktı olarak şunu alırız
"AAAA","BB""BB","CC,CC","""DD""","1"
"WWWW","XX""XX","YY,YY","""DD""","2"
Ö


Hiç yorum yok:

Yorum Gönder