我有一个包含五个字段的简单.csv文件:firstName
(字符串),lastName
(字符串),age
(int),gender
(字符),和priority
(int)。我需要将此文件读入我已经设置的链接列表中。
我的问题是:最简单的方法是什么?我不会发布细节,因为我只是在寻找一般(但简单)的想法;我想弄清楚自己。我们没有比FileReader / FileWriter更高级的文件I / O.我能想到实现这一目标的唯一方法是使用Scanner
导入每一行,然后使用String.split()
将所有内容拆分成一个数组,然后通过数组并手动拉出所有内容/转换为正确的格式(因为它们都是字符串),然后一次性插入到链表中。然而,这似乎是一种令人难以置信的迂回方式。
我能以更简单的方式完成此任务吗?
答案 0 :(得分:5)
有一种更有效的解决方案,无需重新发明轮子: 添加此库opencsv 如果您使用Maven,则可以将此代码放在pom文件中 net.sf.opencsv opencsv 2.3
在图书馆文档中非常好地解释了如何使用它documentacion
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);
我希望这对你有所帮助。
答案 1 :(得分:2)
不幸的是,您已经找到了最简单的解决方案。
通常,Java中的通用数据读取非常不舒服,因为它是静态类型的。 CSV,XML和其他数据序列化方法的部分原因在于它们根据所定义数据的结构进行自我记录。在Java的情况下,这不能很好地工作,因为结构必须是预定义的(通过类)或读入结构如此通用它几乎是无用的(如列表或键 - >值映射,其中一切保持一个字符串)。
这不是Java仇恨,我只是指出,让这项特殊工作变得简单直观,与Java的核心语言功能根本不相容。在像Python这样的动态类型语言中,这样的事情要简单得多(特别是在Python中,由于核心csv模块的存在,几乎是微不足道的),因为你可以将任何类型的数据丢弃到一个对象中,它将适应于适合。 Java必须提前知道将要发生什么,这会导致你发现的尴尬冗长。
答案 2 :(得分:1)
Spring Framework中的StringUtils具有一些功能。 但我会说这并没有什么不同,并引入了不必要的依赖。
坚持你的想法。