回答您的问题:
- 我不知道 Spring Batch 扫描文件的具体机制。
- 您可以将 opencsv 用作通用 CSV 阅读器,有很多读取文件的机制。
关于 OpenCSV:
如果您使用的是 maven 项目,请尝试导入此依赖项:
<dependency>
<groupId>net.sf.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>2.0</version>
</dependency>
您可以读取您的文件,为特定格式或通用标题创建对象,如下所示:
private static List<DadosPeople> extrairDadosPeople() throws IOException {
CSVReader readerPeople = new CSVReader(new FileReader(people));
List<PeopleData> listPeople = new ArrayList<PeopleData>();
String[] nextLine;
while ((nextLine = readerPeople.readNext()) != null) {
PeopleData people = new PeopleData();
people.setIncludeData(nextLine[0]);
people.setPartnerCode(Long.valueOf(nextLine[1]));
listPeople.add(people);
}
readerPeople.close();
return listPeople;
}
还有很多其他方法可以使用 opencsv 读取 CSV 文件:
如果你想使用迭代器样式模式,你可以这样做:
CSVReader reader = new CSVReader(new FileReader("yourfile.csv"));
String [] nextLine;
while ((nextLine = reader.readNext()) != null) {
// nextLine[] is an array of values from the line
System.out.println(nextLine[0] + nextLine[1] + "etc...");
}
或者,如果您可能只想将全部内容放入列表中,只需调用 readAll()...
CSVReader reader = new CSVReader(new FileReader("yourfile.csv"));
List myEntries = reader.readAll();
这将为您提供可以迭代的 String[] 列表。如果一切都失败了,请在此处查看 Javadocs。
如果您想自定义引号字符和分隔符,您会发现可以提供您自己的分隔符和引号字符的构造函数。假设您使用制表符作为分隔符,您可以执行以下操作:
CSVReader reader = new CSVReader(new FileReader("yourfile.csv"), '\t');
如果你单引用你的转义字符而不是双引号,你可以使用三个 arg 构造函数:
CSVReader reader = new CSVReader(new FileReader("yourfile.csv"), '\t', '\'');
如果您知道内容直到文件后面才开始,您也可以跳过文件的前几行。因此,例如,您可以通过以下方式跳过前两行:
CSVReader reader = new CSVReader(new FileReader("yourfile.csv"), '\t', '\'', 2);
我可以用 opencsv 写 csv 文件吗?
是的。在同一个包中有一个 CSVWriter,它遵循与 CSVReader 相同的语义。例如,要编写一个制表符分隔的文件:
CSVWriter writer = new CSVWriter(new FileWriter("yourfile.csv"), '\t');
// feed in your array (or convert your data to an array)
String[] entries = "first#second#third".split("#");
writer.writeNext(entries);
writer.close();
如果您更喜欢使用自己的引号字符,您可以使用构造函数的三个 arg 版本,它采用引号字符(或随意传入 CSVWriter.NO_QUOTE_CHARACTER)。
您还可以自定义生成文件中使用的行终止符(这在您从 Linux Web 应用程序导出到 Windows 客户端时很方便)。为此目的有一个构造函数参数。
我可以将 SQL 表转储为 CSV 吗?
是的,你可以。 CSVWriter 上有一个功能,因此您可以将 writeAll() 传递给 ResultSet。
java.sql.ResultSet myResultSet = ....
writer.writeAll(myResultSet, includeHeaders);
有没有办法将我的 CSV 文件绑定到 Javabean 列表?
是的,有。有一组类允许您根据列名、列位置或自定义映射策略将 CSV 文件绑定到 JavaBean 列表。您可以在 com.opencsv.bean 包中找到新类。以下是如何根据 CSV 文件中的字段位置映射到 java bean:
ColumnPositionMappingStrategy strat = new ColumnPositionMappingStrategy();
strat.setType(YourOrderBean.class);
String[] columns = new String[] {"name", "orderNumber", "id"}; // the fields to bind do in your JavaBean
strat.setColumnMapping(columns);
CsvToBean csv = new CsvToBean();
List list = csv.parse(strat, yourReader);