4

我有一个简单的 .csv 文件,其中包含五个字段:firstName(string)、lastName(string)、age(int)、gender(char) 和priority(int)。我需要将此文件读入我已经设置的链接列表。

我的问题是:解决这个问题的最简单方法是什么?我没有发布细节,因为我只是在寻找一般(但简单)的想法;我想自己弄清楚。在文件 I/O 方面,我们没有比 FileReader / FileWriter 做得更高级。我能想到的唯一方法是使用Scanner导入每一行,然后使用String.split()将所有内容拆分为一个数组,然后遍历数组并手动提取所有内容/转换为正确的格式(因为它们都将是字符串),然后一次全部插入到链表中。然而,这似乎是一种令人难以置信的迂回方式。

有没有更简单的方法可以做到这一点?

4

3 回答 3

5

有一个更有效的解决方案,无需重新发明轮子:添加这个库 opencsv 如果你使用 Maven,你可以把这个代码放在你的 pom 文件中 net.sf.opencsv opencsv 2.3

在图书馆文档中很好地解释了如何使用它

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);

我希望这对你有帮助。

于 2012-11-10T08:18:17.807 回答
2

不幸的是,您已经找到了最简单的解决方案。

一般来说,Java 中的泛型数据读取非常不舒服,因为它是静态类型的。CSV、XML 和其他数据序列化方法的部分意义在于,它们在定义的数据结构方面是自记录的。在 Java 的情况下,这不太好用,因为结构必须是预定义的(通过类)或读入一个通用的结构,它几乎是无用的(如列表或键-> 值映射,所有内容都保留)一个字符串)。

这不是对 Java 的仇恨咆哮,我只是指出,使这项特殊的工作变得简单和直观与 Java 的核心语言特性根本不兼容。在像 Python 这样的动态类型语言中,这样的事情要简单得多(尤其是在 Python 中,由于核心 csv 模块的存在,这几乎是微不足道的),因为您可以将任何类型的数据放入对象中,并且它会适应. Java 必须提前知道会发生什么,这会导致您发现的尴尬冗长。

于 2012-11-09T20:21:36.357 回答
1

Spring 框架中的 StringUtils 有一些功能。但我想说它并没有真正产生任何影响,并且引入了不必要的依赖。

坚持你的想法。

于 2012-11-09T20:24:01.553 回答