1. บทนำ
บทความสั้น ๆ นี้แนะนำ OpenCSV 4 ซึ่งเป็นไลบรารีที่ยอดเยี่ยมสำหรับการเขียนการอ่านการทำให้เป็นอนุกรมการแยกส่วนแยกส่วนและ / หรือการแยกวิเคราะห์ไฟล์. csv ! ด้านล่างนี้เราจะดูตัวอย่างต่างๆที่สาธิตวิธีการตั้งค่าและใช้ OpenCSV 4 สำหรับความพยายามของคุณ
2. การตั้งค่า
วิธีเพิ่ม OpenCSV ในโปรเจ็กต์ของคุณโดยใช้pom.xmlอ้างอิง:
com.opencsv opencsv 4.1
.jarsสำหรับ OpenCSV สามารถพบได้ที่เว็บไซต์อย่างเป็นทางการหรือผ่านอย่างรวดเร็วค้นหามากกว่าที่ Maven Repository
ไฟล์. csvของเราจะง่ายมากเราจะเก็บไว้เป็นสองคอลัมน์และสี่แถว:
colA, ColB A, B C, D G, G G, F
3. ถั่วหรือไม่ถั่ว
หลังจากเพิ่ม OpenCSV ที่คุณpom.xmlเราสามารถใช้วิธีการในสองวิธีที่สะดวก CSV จัดการ:
- ใช้วัตถุCSVReaderและCSVWriter ที่มีประโยชน์(สำหรับการดำเนินการที่ง่ายขึ้น) หรือ
- ใช้CsvToBeanเพื่อแปลงไฟล์. csvเป็น bean (ซึ่งใช้เป็นjava-objectsที่มีคำอธิบายประกอบ)
เราจะยึดติดกับตัวอย่างซิงโครนัส (หรือบล็อก ) สำหรับบทความนี้เพื่อให้เราสามารถเน้นพื้นฐาน
โปรดจำไว้ว่าวิธีการซิงโครนัสจะป้องกันไม่ให้โค้ดรอบข้างหรือรหัสที่ตามมาทำงานจนกว่าจะเสร็จสิ้น สภาพแวดล้อมการผลิตใด ๆ มักจะใช้วิธีการแบบอะซิงโครนัสหรือ ( ไม่ปิดกั้น ) ซึ่งจะอนุญาตให้กระบวนการหรือวิธีการอื่น ๆ ดำเนินการให้เสร็จสิ้นในขณะที่เมธอดอะซิงโครนัสเสร็จสิ้น
เราจะเจาะลึกตัวอย่างแบบอะซิงโครนัสสำหรับ OpenCSV ในบทความในอนาคต
3.1. CSVReader
CSVReader - ผ่านวิธีการreadAll ()และreadNext () ที่ให้มา ! มาดูวิธีใช้readAll () ซิงโครนัส:
public List readAll(Reader reader) throws Exception { CSVReader csvReader = new CSVReader(reader); List list = new ArrayList(); list = csvReader.readAll(); reader.close(); csvReader.close(); return list; }
จากนั้นเราสามารถเรียกวิธีการนั้นได้โดยส่งผ่านBufferedReader :
public String readAllExample() throws Exception { Reader reader = Files.newBufferedReader(Paths.get( ClassLoader.getSystemResource("csv/twoColumn.csv").toURI())); return CsvReaderExamples.readAll(reader).toString(); }
ในทำนองเดียวกันเราสามารถนามธรรมreadNext () ซึ่งอ่าน. csv ที่ให้มาทีละบรรทัด:
public List oneByOne(Reader reader) throws Exception { List list = new ArrayList(); CSVReader csvReader = new CSVReader(reader); String[] line; while ((line = csvReader.readNext()) != null) { list.add(line); } reader.close(); csvReader.close(); return list; }
และเราสามารถเรียกวิธีนั้นได้ที่นี่โดยส่งผ่านBufferReader:
public String oneByOneExample() throws Exception { Reader reader = Files.newBufferedReader(Paths.get( ClassLoader.getSystemResource("csv/twoColumn.csv").toURI())); return CsvReaderExamples.oneByOne(reader).toString(); }
เพื่อความยืดหยุ่นและตัวเลือกการกำหนดค่าที่มากขึ้นคุณสามารถใช้CSVReaderBuilder :
CSVParser parser = new CSVParserBuilder() .withSeparator(',') .withIgnoreQuotations(true) .build(); CSVReader csvReader = new CSVReaderBuilder(reader) .withSkipLines(0) .withCSVParser(parser) .build();
CSVReaderBuilderช่วยให้หนึ่งที่จะข้ามส่วนหัวของคอลัมน์และกฎระเบียบแยกชุดผ่านCSVParserBuilder
เมื่อใช้CSVParserBuilderเราสามารถเลือกตัวคั่นคอลัมน์ที่กำหนดเองละเว้นหรือจัดการกับเครื่องหมายคำพูดระบุวิธีที่เราจะจัดการช่องว่างและวิธีตีความอักขระที่ใช้ Escape สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่าการกำหนดค่าเหล่านี้โปรดดูเอกสารข้อมูลจำเพาะอย่างเป็นทางการ
เช่นเคยโปรดอย่าลืมปิดโปรแกรมอ่านของคุณทั้งหมดเพื่อป้องกันการรั่วไหลของหน่วยความจำ!
3.2. CSVWriter
CSVWriterให้ความสามารถในการเขียนไฟล์. csvพร้อมกันหรือทีละบรรทัด
มาดูวิธีการเขียน. csv ทีละบรรทัด:
public String csvWriterOneByOne(List stringArray, Path path) throws Exception { CSVWriter writer = new CSVWriter(new FileWriter(path.toString())); for (String[] array : stringArray) { writer.writeNext(array); } writer.close(); return Helpers.readFile(path); }
ตอนนี้ให้ระบุตำแหน่งที่เราต้องการบันทึกไฟล์นั้นและเรียกใช้วิธีที่เราเพิ่งเขียน:
public String csvWriterOneByOne() throws Exception{ Path path = Paths.get( ClassLoader.getSystemResource("csv/writtenOneByOne.csv").toURI()); return CsvWriterExamples.csvWriterOneByOne(Helpers.fourColumnCsvString(), path); }
นอกจากนี้เรายังสามารถเขียนของเรา.csvทั้งหมดในครั้งเดียวโดยผ่านในรายการของStringอาร์เรย์ตัวแทนแถวของเรา.csv :
public String csvWriterAll(List stringArray, Path path) throws Exception { CSVWriter writer = new CSVWriter(new FileWriter(path.toString())); writer.writeAll(stringArray); writer.close(); return Helpers.readFile(path); }
และนี่คือวิธีที่เราเรียกว่า:
public String csvWriterAll() throws Exception { Path path = Paths.get( ClassLoader.getSystemResource("csv/writtenAll.csv").toURI()); return CsvWriterExamples.csvWriterAll(Helpers.fourColumnCsvString(), path); }
แค่นั้นแหละ!
3.3. การอ่านโดยใช้ถั่ว
OpenCSV สามารถทำให้ไฟล์. csv เป็นอนุกรมลงในสคีมาที่กำหนดไว้ล่วงหน้าและนำกลับมาใช้ใหม่ได้ซึ่งใช้เป็น Java pojo beans CsvToBeanถูกสร้างโดยใช้CsvToBeanBuilder ตั้งแต่ OpenCSV 4 CsvToBeanBuilderเป็นวิธีที่แนะนำในการทำงานกับcom.opencsv.bean.CsvToBean
นี่คือถั่วง่ายๆที่เราสามารถใช้เพื่อทำให้เป็นอนุกรม. csvสองคอลัมน์ของเราจากส่วนที่ 2 :
public class SimplePositionBean { @CsvBindByPosition(position = 0) private String exampleColOne; @CsvBindByPosition(position = 1) private String exampleColTwo; // getters and setters }
แต่ละคอลัมน์ในไฟล์. csvเชื่อมโยงกับฟิลด์ใน bean การแม็พระหว่างส่วนหัวของคอลัมน์. csvสามารถทำได้โดยใช้คำอธิบายประกอบ@CsvBindByPositionหรือ@CsvBindByNameซึ่งระบุการแมปตามตำแหน่งหรือการจับคู่สตริงส่วนหัวตามลำดับ
ขั้นแรกให้สร้างซูเปอร์คลาสที่เรียกว่า CsvBean ซึ่งจะช่วยให้เราสามารถใช้ซ้ำและสรุปวิธีการที่เราจะสร้างด้านล่าง:
public class CsvBean { }
ตัวอย่างคลาสย่อย:
public class NamedColumnBean extends CsvBean { @CsvBindByName(column = "name") private String name; @CsvBindByName private int age; // getters and setters }
ขอสรุปรายการที่ส่งคืนแบบซิงโครนัสโดยใช้CsvToBean :
public List beanBuilderExample(Path path, Class clazz) throws Exception { CsvTransfer csvTransfer = new CsvTransfer(); ColumnPositionMappingStrategy ms = new ColumnPositionMappingStrategy(); ms.setType(clazz); Reader reader = Files.newBufferedReader(path); CsvToBean cb = new CsvToBeanBuilder(reader) .withType(clazz) .withMappingStrategy(ms) .build(); csvTransfer.setCsvList(cb.parse()); reader.close(); return csvTransfer.getCsvList(); }
We pass in our bean (clazz) and set that as the ColumnPositionMappingStrategy. In doing so, we associate the fields of our beans with the respective columns of our .csv rows.
We can call that here using the SimplePositionBean subclass of the CsvBean we wrote above:
public String simplePositionBeanExample() throws Exception { Path path = Paths.get( ClassLoader.getSystemResource("csv/twoColumn.csv").toURI()); return BeanExamples.beanBuilderExample(path, SimplePositionBean.class).toString(); }
or here using the NamedColumnBean – another subclass of the CsvBean:
public String namedColumnBeanExample() throws Exception { Path path = Paths.get( ClassLoader.getSystemResource("csv/namedColumn.csv").toURI()); return BeanExamples.beanBuilderExample(path, NamedColumnBean.class).toString(); }
3.4. Bean-Based Writing
Lastly, let's take a look at how to use the StatefulBeanToCsv class to write to a .csv file:
public String writeCsvFromBean(Path path) throws Exception { Writer writer = new FileWriter(path.toString()); StatefulBeanToCsv sbc = new StatefulBeanToCsvBuilder(writer) .withSeparator(CSVWriter.DEFAULT_SEPARATOR) .build(); List list = new ArrayList(); list.add(new WriteExampleBean("Test1", "sfdsf", "fdfd")); list.add(new WriteExampleBean("Test2", "ipso", "facto")); sbc.write(list); writer.close(); return Helpers.readFile(path); }
Here, we are specifying how we will delimit our data which is supplied as a List of specified CsvBean objects.
จากนั้นเราสามารถเรียกเมธอดของเราว่าwriteCsvFromBean ()หลังจากผ่านในพา ธ ไฟล์เอาต์พุตที่ต้องการ:
public String writeCsvFromBeanExample() { Path path = Paths.get( ClassLoader.getSystemResource("csv/writtenBean.csv").toURI()); return BeanExamples.writeCsvFromBean(path); }
4. สรุป
มีเราไป - ตัวอย่างโค้ดสำหรับซิงโครOpenCSVใช้ถั่วCSVReaderและCSVWriter ตรวจสอบเอกสารอย่างเป็นทางการที่นี่
เช่นเคยตัวอย่างโค้ดมีให้ใน GitHub