Java OpenCSV - 2 列表比较和复制
Java OpenCSV - 2 List comparison and duplication
我打算制作一个应用程序,使用 OpenCSV 比较 2 个 .csv 列表。它应该是这样工作的:
- 打开 2 个 .csv 文件(每个文件都有列:姓名、电子邮件)
- 保存结果(这是一个问题,我不知道它是否应该保存到 table 或其他东西)
- 比较 "Emails column" 的 List1 和 List2 值。
- 如果列表 1 中的电子邮件出现在列表 2 中 - 将其删除(从列表 1 中)
- 将结果导出到新的 .csv 文件
不知道算法好不好。请告诉我在这种情况下保存读取 .csv 文件的结果的最佳选择。
亲切的问候
您可以使用 univocity-parsers 更轻松地解决这个问题,因为它可以将您的数据读入列中:
CsvParserSettings parserSettings = new CsvParserSettings(); //parser config with many options, check the tutorial
parserSettings.setHeaderExtractionEnabled(true); // uses the first row as headers
// To get the values of all columns, use a column processor
ColumnProcessor rowProcessor = new ColumnProcessor();
parserSettings.setRowProcessor(rowProcessor);
CsvParser parser = new CsvParser(parserSettings);
//This will parse everything and pass the data to the column processor
parser.parse(new FileReader(new File("/path/to/your/file.csv")));
//Finally, we can get the column values:
Map<String, List<String>> columnValues = rowProcessor.getColumnValuesAsMapOfNames();
假设您用它解析了第二个 CSV。只需抓取电子邮件并创建一个集合:
Set<String> emails = new HashSet<>(columnValues.get("Email"));
现在只需遍历第一个 CSV 并检查电子邮件是否在 emails
集中。
披露:我是这个图书馆的作者。它是开源且免费的(Apache V2.0 许可)。
如果您有使用 openCSV 的硬性要求,那么我认为这是最简单的解决方案:
首先,我喜欢 Jeronimo 关于 HashSet 的建议。首先使用 CSVToBean 读取第二个 csv 文件,并将电子邮件地址保存在 HashSet 中。
然后创建一个实现 CSVToBeanFilter 接口的过滤器 class。在构造函数中传入集合并在 allowLine 方法中查找电子邮件地址,如果不在集合中则 return 为 true(以便快速查找)。
然后你在 CsvToBean.parse 中传递过滤器,当 reading/parsing 第一个文件时,你将得到的只是第一个文件中电子邮件地址不在第二个文件中的记录。 CSVToBeanFilter javadoc 有一个很好的例子来说明它是如何工作的。
最后使用 BeanToCSV 从筛选列表中创建一个文件。
为了公平起见,我是 openCSV 项目的维护者,它也是开源和免费的(Apache V2.0 许可)。
我打算制作一个应用程序,使用 OpenCSV 比较 2 个 .csv 列表。它应该是这样工作的:
- 打开 2 个 .csv 文件(每个文件都有列:姓名、电子邮件)
- 保存结果(这是一个问题,我不知道它是否应该保存到 table 或其他东西)
- 比较 "Emails column" 的 List1 和 List2 值。
- 如果列表 1 中的电子邮件出现在列表 2 中 - 将其删除(从列表 1 中)
- 将结果导出到新的 .csv 文件
不知道算法好不好。请告诉我在这种情况下保存读取 .csv 文件的结果的最佳选择。
亲切的问候
您可以使用 univocity-parsers 更轻松地解决这个问题,因为它可以将您的数据读入列中:
CsvParserSettings parserSettings = new CsvParserSettings(); //parser config with many options, check the tutorial
parserSettings.setHeaderExtractionEnabled(true); // uses the first row as headers
// To get the values of all columns, use a column processor
ColumnProcessor rowProcessor = new ColumnProcessor();
parserSettings.setRowProcessor(rowProcessor);
CsvParser parser = new CsvParser(parserSettings);
//This will parse everything and pass the data to the column processor
parser.parse(new FileReader(new File("/path/to/your/file.csv")));
//Finally, we can get the column values:
Map<String, List<String>> columnValues = rowProcessor.getColumnValuesAsMapOfNames();
假设您用它解析了第二个 CSV。只需抓取电子邮件并创建一个集合:
Set<String> emails = new HashSet<>(columnValues.get("Email"));
现在只需遍历第一个 CSV 并检查电子邮件是否在 emails
集中。
披露:我是这个图书馆的作者。它是开源且免费的(Apache V2.0 许可)。
如果您有使用 openCSV 的硬性要求,那么我认为这是最简单的解决方案:
首先,我喜欢 Jeronimo 关于 HashSet 的建议。首先使用 CSVToBean 读取第二个 csv 文件,并将电子邮件地址保存在 HashSet 中。
然后创建一个实现 CSVToBeanFilter 接口的过滤器 class。在构造函数中传入集合并在 allowLine 方法中查找电子邮件地址,如果不在集合中则 return 为 true(以便快速查找)。
然后你在 CsvToBean.parse 中传递过滤器,当 reading/parsing 第一个文件时,你将得到的只是第一个文件中电子邮件地址不在第二个文件中的记录。 CSVToBeanFilter javadoc 有一个很好的例子来说明它是如何工作的。
最后使用 BeanToCSV 从筛选列表中创建一个文件。
为了公平起见,我是 openCSV 项目的维护者,它也是开源和免费的(Apache V2.0 许可)。