16 Eylül 2020 Çarşamba

CSVParser Sınıfı - CVS Dosyası Okur

Giriş
Şu satırı dahil ederiz.
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;
CVS veya TXT dosyası okumak için kullanılır.

Kullanım
Örnek
Şöyle yaparız.
Reader reader = ...;
CSVParser csvParser = null;
try {
  csvParser = new CSVParser(reader, CSVFormat.DEFAULT
    .withEscape('/')
    .withFirstRecordAsHeader()
    .withDelimiter('|')
    .withIgnoreHeaderCase()
    .withTrim());
  ...
} finally {
  inputStream.close();
  reader.close();
  if (csvParser != null) {
    csvParser.close();
  }
}
constructor - Reader + CSVFormat
Ö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) {
    // Accessing Values by Column Index

    String name = csvRecord.get(0);
    //Accessing the values by column header name
    String Teacher= csvRecord.get(1);
    String years = csvRecord.get(2);

    //Printing the record
    System.out.println("Record Number - " + csvRecord.getRecordNumber());
    System.out.println("Name: " + name);
    System.out.println("Teacher: " + Teacher);
    System.out.print("Years : " + years );
    System.out.println("\n\n");
}
getHeaders metodu
Elimizde şöyle bir TXT dosyası olsun. Hatta bu dosyada eksik sütunlar olsun.
A,B,C,D
1,2,3,4
1,2,3
1,2
1
1,
1,,
1,,,
,,,4,,,
Şöyle yaparız.
CSVFormat csvFormat = CSVFormat.DEFAULT.withHeader();
try (CSVParser csvParser = csvFormat.parse(Files.newBufferedReader(Paths.get("t.txt")))){
  System.out.println(csvParser.getHeaderNames());
  for (CSVRecord csvRecord : csvParser) {
    System.out.println(csvRecord);
    System.out.println("  toMap(): " + csvRecord.toMap());

    Map<String, String> map = csvRecord.toMap();
      for (String name : csvParser.getHeaderNames())
        map.putIfAbsent(name, "");
      System.out.println("  fixed  : " + map);
    }
}
Çıktı olarak şunu alırız
[A, B, C, D]
CSVRecord [comment='null', recordNumber=1, values=[1, 2, 3, 4]]
  toMap(): {A=1, B=2, C=3, D=4}
  fixed  : {A=1, B=2, C=3, D=4}
CSVRecord [comment='null', recordNumber=2, values=[1, 2, 3]]
  toMap(): {A=1, B=2, C=3}
  fixed  : {A=1, B=2, C=3, D=}
CSVRecord [comment='null', recordNumber=3, values=[1, 2]]
  toMap(): {A=1, B=2}
  fixed  : {A=1, B=2, C=, D=}
CSVRecord [comment='null', recordNumber=4, values=[1]]
  toMap(): {A=1}
  fixed  : {A=1, B=, C=, D=}
CSVRecord [comment='null', recordNumber=5, values=[1, ]]
  toMap(): {A=1, B=}
  fixed  : {A=1, B=, C=, D=}
CSVRecord [comment='null', recordNumber=6, values=[1, , ]]
  toMap(): {A=1, B=, C=}
  fixed  : {A=1, B=, C=, D=}
CSVRecord [comment='null', recordNumber=7, values=[1, , , ]]
  toMap(): {A=1, B=, C=, D=}
  fixed  : {A=1, B=, C=, D=}
CSVRecord [comment='null', recordNumber=8, values=[, , , 4, , , ]]
  toMap(): {A=, B=, C=, D=4}
  fixed  : {A=, B=, C=, D=4}
getRecords metodu
Şöyle yaparız.
CSVParser csvParser = ...
List<CSVRecord> recordList = csvParser.getRecords();
for Döngüsü
Açıklaması şöyle
CSVParser implements Iterable<CSVRecord>, so we can use a for-each loop
Örnek
Elimizde şöyle bir veri olsun
id,first,last,city
1,john,doe,austin
2,jane,mary,seattle
Şöyle yaparız
String path = "./data/data.csv";

Map<Integer, User> map = new HashMap<>();
try (CSVParser csvParser = new CSVParser(Files.newBufferedReader(Paths.get(path)),
                                         CSVFormat.RFC4180.withFirstRecordAsHeader())) {
    for (CSVRecord csvRecord : csvParser) {
        User currentUser = new User(
                Integer.parseInt(csvRecord.get("id")),
                csvRecord.get("first"),
                csvRecord.get("last"),
                csvRecord.get("city")
        );
        map.put(currentUser.getId(), currentUser);
    }
}

Hiç yorum yok:

Yorum Gönder