- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在构建一个过程来合并一些大的排序 csv 文件。我目前正在研究使用 Univocity 来执行此操作。我设置合并的方法是使用实现可比接口(interface)的 bean。
简化后的文件如下所示:
id,data
1,aa
2,bb
3,cc
bean 看起来像这样(省略了 getter 和 setter):
public class Address implements Comparable<Address> {
@Parsed
private int id;
@Parsed
private String data;
@Override
public int compareTo(Address o) {
return Integer.compare(this.getId(), o.getId());
}
}
比较器看起来像这样:
public class AddressComparator implements Comparator<Address>{
@Override
public int compare(Address a, Address b) {
if (a == null)
throw new IllegalArgumentException("argument object a cannot be null");
if (b == null)
throw new IllegalArgumentException("argument object b cannot be null");
return Integer.compare(a.getId(), b.getId());
}
}
由于我不想读取内存中的所有数据,所以我想读取每个文件的顶部记录并执行一些比较逻辑。这是我的简化示例:
public class App {
private static final String INPUT_1 = "src/test/input/address1.csv";
private static final String INPUT_2 = "src/test/input/address2.csv";
private static final String INPUT_3 = "src/test/input/address3.csv";
public static void main(String[] args) throws FileNotFoundException {
BeanListProcessor<Address> rowProcessor = new BeanListProcessor<Address>(Address.class);
CsvParserSettings parserSettings = new CsvParserSettings();
parserSettings.setRowProcessor(rowProcessor);
parserSettings.setHeaderExtractionEnabled(true);
CsvParser parser = new CsvParser(parserSettings);
List<FileReader> readers = new ArrayList<>();
readers.add(new FileReader(new File(INPUT_1)));
readers.add(new FileReader(new File(INPUT_2)));
readers.add(new FileReader(new File(INPUT_3)));
// This parses all rows, but I am only interested in getting 1 row as a bean.
for (FileReader fileReader : readers) {
parser.parse(fileReader);
List<Address> beans = rowProcessor.getBeans();
for (Address address : beans) {
System.out.println(address.toString());
}
}
// want to have a map with the reader and the first bean object
// Map<FileReader, Address> topRecordofReader = new HashMap<>();
Map<FileReader, String[]> topRecordofReader = new HashMap<>();
for (FileReader reader : readers) {
parser.beginParsing(reader);
String[] row;
while ((row = parser.parseNext()) != null) {
System.out.println(row[0]);
System.out.println(row[1]);
topRecordofReader.put(reader, row);
// all done, only want to get first row
break;
}
}
}
}
在上面的示例中,我如何以遍历每一行并每行返回一个 bean 的方式进行解析,而不是解析整个文件?
我正在寻找这样的东西(这段无效代码只是为了表明我正在寻找的解决方案类型):
for (FileReader fileReader : readers) {
parser.beginParsing(fileReader);
Address bean = null;
while (bean = parser.parseNextRecord() != null) {
topRecordofReader.put(fileReader, bean);
}
}
最佳答案
有两种方法可以迭代读取而不是将所有内容加载到内存中,第一种是使用 BeanProcessor
而不是 BeanListProcessor
:
settings.setRowProcessor(new BeanProcessor<Address>(Address.class) {
@Override
public void beanProcessed(Address address, ParsingContext context) {
// your code to process the each parsed object here!
}
为了在没有回调的情况下迭代地读取 bean(并执行一些其他常见的过程),我们创建了一个 CsvRoutines类(从 AbstractRoutines 扩展 - 更多示例 here ):
File input = new File("/path/to/your.csv")
CsvParserSettings parserSettings = new CsvParserSettings();
//...configure the parser
// You can also use TSV and Fixed-width routines
CsvRoutines routines = new CsvRoutines(parserSettings);
for (Address address : routines.iterate(Address.class, input, "UTF-8")) {
//process your bean
}
希望这对您有所帮助!
关于java - Univocity - 如何使用迭代器样式每行返回一个 bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38051534/
我正在尝试使用 univocity 解析器验证我的项目中的日期字段。 我知道univocity中有自定义 validator 和格式注释。但是我们需要在实现 bean 类时提供静态日期格式。 @For
我正在使用 uniVocity 来解析两个不同的文件。对于第一个文件的每一行,我需要迭代文件 2 以便进行一些比较。 RowListProcessor rowProcessor = new R
我正在使用这个: List row = new ArrayList(); row.add("value 1"); row.add("value 2"); writer.writeRow(row); 它
我正在尝试从 csv 文件中的特定位置(而不是括号)创建一个列表。 class Person {// @Parsed private String name; @?? private Address
我有下一个 .csv 文件: tt0102057, 6, 2010-06-19, Hook tt0102059, 7 ,2013-06-23, Hot Shots! tt0102070, 5, 201
我试图在 uniVocity-parsers 的帮助下从 GTFS.zip 读取 CSV 文件,但遇到了一个我无法弄清楚的问题。出于某种原因,某些 CSV 文件的第一列似乎无法正确解析。例如在看起来像
我有一个像这样的固定结构化文件 5 种类型记录,GM、AB、TM、DM、IN 如您所见,TM 和 DM 是主从关系 而且 DM 和 IN 也处于主从关系 GM01012020 ABXX-43432 T
我正在为 univocity 解析器创建一些自定义 validator ,我想添加一些这样的参数: public class Size implements Validator int m
我正在尝试找出使用大学解析器处理 CSV 日志文件的最佳方法,其行如下所示, "23.62.3.74",80,"testUserName",147653,"日志收集设备100","31/02/15 0
我从数据库中卸载了一个文件,所有 varchar 列都用引号引起来,无论列的实际内容如何(不幸的是,卸载过程超出了我的控制范围)。 像这样: 1,"Alex ,/,awesome/,","chan"
当我实例化 FixedWidthParser 时与 MultiBeanListProcessor CommonParserSettings#configureFromAnnotations(beanC
我主要使用uniVocity作为CSV解析器,它是一个优秀的解析器。我遇到了以下行的问题,该文件将有固定数量的 7 列。问题是客户端名称,它可以有逗号,它的下一列类型,一般是S或P。 下面是测试数据
介绍 我正在构建一个过程来合并一些大的排序 csv 文件。我目前正在研究使用 Univocity 来执行此操作。我设置合并的方法是使用实现可比接口(interface)的 bean。 给出 简化后
我需要解析不规则(尽管一致)的“csv”文件。内容如下所示: Field1: Field1Text Field2: Field2Text Field3 (need to ignore) Field4
我有一个场景,其中数据中的一行在内容中有分隔符。 5 |0St"|"ring |field[1] 应该始终传递 - 带引号的字段分隔符 分隔符在哪里 |并且它也出现在其中一列中,如上所示。 我的配置如
我正在使用 Univocity 解析器解析 CSV 文件并将它们填充到 Bean 中。 我面临的问题是我有两个不同的文件。这两个文件的结构相同,但列数不同。它们都引用相同的 Bean 类。 例如: F
我想使用Java和uniVocity-parsers来解析由mysqlselect into outfile生成的csv数据。 现在我遇到一种处理不可打印字符的情况!mysql表包含bit(1)列,当
我正在解析的文件之一由两部分组成,我需要将它们逻辑上分成两个不同的 bean。我发现 MultiBeanListProcessor 是实现此目的的好方法。我用过test example 14作为我的代
给定两个类 public class Inventory { private List lines; } 和 public class InventoryLine { private
我正在使用 univocity 将一些文件解析为 javabean。这些 Bean 是已编译的类。但是,我希望在运行时生成这些类,然后将文件解析为运行时生成的类。 完整代码在这里:gist 使用 Un
我是一名优秀的程序员,十分优秀!