我正在为一所学校项目工作,我很难搞清楚如何将CSV文件导入并格式化为可用的格式。 CSV在第一列中包含一个电影名称,在行中包含放映时间,因此它看起来像这样。
movie1,7pm,8pm,9pm,10pm
movie2,下午5点,晚上8点
movie3,下午3点,晚上7点,晚上10点
我想我想将每一行拆分成自己的数组,也许是数组的一个arraylist?我真的不知道从哪里开始所以任何指针都会受到赞赏。
最好不要使用任何外部库。
答案 0 :(得分:0)
您可以使用opencsv读取CSV文件并将每个String []添加到ArrayList。 opencsv's网站的常见问题部分中有一些示例。
编辑:如果您不想使用外部库,可以使用BufferedReader读取CSV并用逗号分隔行。
BufferedReader br = null;
try{
List<String[]> data = new ArrayList<String[]>();
br = new BufferedReader(new FileReader(new File("csvfile")));
String line;
while((line = br.readLine()) != null){
String[] lineData = line.split(",");
data.add(lineData);
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(br != null) try{ br.close(); } catch(Exception e){}
}
答案 1 :(得分:0)
我会使用Map
将电影名称作为关键字,时间安排为list
,如下所示:
Map<String, List<String>> movieTimings = new HashMap<>();
它将读取csv文件并将值放入此映射中。如果密钥已经存在,那么我们只需要将值添加到列表中。您可以使用computeIfAbsent
的{{1}}方法(Java 8)查看条目是否存在,例如:
Map
一旦读取文件,这将填充您的地图。就阅读文件而言,您可以使用public static void main(String[] args) {
Map<String, List<String>> movieTimings = new HashMap<>();
String timing = "7pm";//It will be read from csv
movieTimings.computeIfAbsent("test", s -> new ArrayList<>()).add(timing);
System.out.println(movieTimings);
}
或OpenCSV(如果您的项目允许您使用第三方库)。
答案 2 :(得分:0)
我与Univocity没有任何关系 - 但他们的Java CSV解析器非常棒且免费。当我有问题时,其中一位开发人员立刻回复了我。 http://www.univocity.com/pages/about-parsers
您在一行中阅读,然后在字段中循环。由于您知道电影名称始终存在且至少有一个电影时间,您可以按照自己喜欢的方式进行设置,包括arraylists的arraylist(因此两者都是可变长度数组)。
它适用于我们在字段周围没有引号(当电影名称中有撇号或逗号时必需)。在我解决的问题中,所有行都具有相同数量的列,但在解析文件之前我不知道列数,并且每个文件通常具有不同数量的列和列名称,并且它完美地工作。