读取csv文档
CSV(Comma Separated Values)文件是一种常见的数据存储格式,常用于数据交换,因其简单、通用而被广泛使用。在Java中,解析CSV文件通常需要借助第三方库,如本例中提到的`javacsv-2.0.jar`。下面我们将详细讲解如何使用Java和Struts2框架来实现CSV文件的读取与处理。 在前端,我们需要一个HTML表单让用户选择要上传的CSV文件。在Struts2框架下,我们可以使用Struts2的标签库来创建这样一个表单: ```jsp <div class="control-group"> <@s.label value="全科目文件" required="true"/> <div class="controls"> <input type="file" name="datafile"> <!-- 这里定义了用于文件上传的input字段 --> </div> </div> ``` 这里的`<input type="file" name="datafile">`标签允许用户选择本地的CSV文件,`name="datafile"`用于标识这个字段,以便在后端获取。 接着,我们来看后端的处理。在Action类中,我们需要定义一个`File`类型的属性来接收上传的文件,并提供getter和setter方法: ```java private File datafile; public File getDatafile() { return datafile; } public void setDatafile(File datafile) { this.datafile = datafile; } ``` 然后定义一个`save_upload`方法,检查文件是否上传成功,并调用Service层的方法进行处理: ```java public Result save_upload(){ if(datafile == null){ throw new BusinessException("文件未上传"); } try { this.allsubjectService.upload(datafile); } catch (IOException e) { e.printStackTrace(); throw new BusinessException("文件导入失败"); } } ``` Service层是业务逻辑处理的核心,这里我们创建一个`upload`方法来读取CSV文件: ```java public void upload(File dataFile) throws IOException { CsvReader reader = null; InputStream inputStream = null; try { inputStream = new FileInputStream(dataFile); reader = new CsvReader(inputStream, Charset.forName("GBK")); // 使用GBK编码读取 reader.readHeaders(); // 如果不需要表头,跳过这一行 ArrayList<String[]> csvList = new ArrayList<String[]>(); // 存储每一行的数据 while (reader.readRecord()) { csvList.add(reader.getValues()); } for (int row = 0; row < csvList.size(); row++) { // 从第0行开始处理数据 String code = csvList.get(row)[0]; String proName = csvList.get(row)[1]; // ...其他列的数据处理 if (proName == null || proName.equals("")) { continue; // 如果为空或null则跳过当前行 } // 创建并填充实体对象 Allsubject subject = new Allsubject(); subject.setCode(code); subject.setProName(proName.trim()); // 使用Hibernate持久化对象到数据库 session.persist(subject); } } finally { // 关闭资源 try { reader.close(); } catch (Exception e) {} try { inputStream.close(); } catch (Exception e) {} } } ``` 在Service层的`upload`方法中,我们使用`CsvReader`来读取CSV文件,通过`readRecord()`遍历每一行,`getValues()`获取当前行的值,然后将数据解析并保存到对应的业务对象中,最后使用Hibernate的`session.persist(subject)`方法将对象插入数据库。 总结起来,这个示例展示了如何在Struts2框架下实现CSV文件的上传、读取和解析,并将数据存储到数据库的过程。在实际开发中,你可能需要根据具体需求对文件内容进行更复杂的处理,例如数据验证、异常处理等。同时,对于大数据量的CSV文件,还应考虑性能优化,比如分批处理或使用流式读取等技术。