我正在试图找出用Java解析csv文件的最佳方法。现在每行都有X条信息。例如,第一行最多可以包含5个字符串单词(用逗号分隔它们),而接下来的几行可能有3或6个或更多。
我的问题是没有从文件中读取字符串。只是为了清楚。我的问题是什么数据结构最好保持每一行以及该行中的每个单词?
起初我考虑使用2D数组,但问题是数组大小必须是静态的(第二个索引大小将保存每行中有多少个单词,这可能因行而异) 。
以下是CSV文件的前几行:
0,MONEY
1,SELLING
2,DESIGNING
3,MAKING
DIRECTOR,3DENT95VGY,EBAD,SAGHAR,MALE,05/31/2011,null,0,10000,07/24/2011
3KEET95TGY,05/31/2011,04/17/2012,120050
3LERT9RVGY,04/17/2012,03/05/2013,132500
3MEFT95VGY,03/05/2013,null,145205
DIRECTOR,XKQ84P6CDW,AGHA,ZAIN,FEMALE,06/06/2011,null,1,1000,01/25/2012
XK4P6CDW,06/06/2011,09/28/2012,105000
XKQ8P6CW,09/28/2012,null,130900
DIRECTOR,YGUSBQK377,AYOUB,GRAMPS,FEMALE,10/02/2001,12/17/2007,2,12000,01/15/2002
答案 0 :(得分:3)
使用Array List。它们是具有动态大小的数组。
答案 1 :(得分:2)
最好的方法是使用CSV解析器,例如http://opencsv.sourceforge.net/。此解析器使用List of String []来保存数据。
答案 2 :(得分:2)
您可以使用Map<Integer, List<String>>
。键是csv文件中的行号,List是每行中的单词。
另外一点:您可能会经常使用List#get(int)
方法。如果是这种情况,请不要使用链接列表。这是因为链表的get(int)
是O(n)。我认为ArrayList
是您最好的选择。
编辑(基于AlexWien的观察):
在这种特殊情况下,由于键是行号,因此产生一组连续的整数,更好的数据结构可能是ArrayList<ArrayList<String>>
。这将导致更快的密钥检索。
答案 3 :(得分:0)
使用List<String>()
,可以动态扩展。
如果您想拥有2个尺寸,请使用List<List<String>>()
。
以下是一个例子:
List<List<String>> data = new ArrayList<List<String>>();
List<String> temp = Arrays.asList(someString.split(","));
data.add(temp);
把它放在某种循环中,然后得到你的数据。