如何处理导入具有不同列长度的{CSV}文件

时间:2016-12-17 23:44:46

标签: java arrays sorting csv

我正在为一所学校项目工作,我很难搞清楚如何将CSV文件导入并格式化为可用的格式。 CSV在第一列中包含一个电影名称,在行中包含放映时间,因此它看起来像这样。

movie1,7pm,8pm,9pm,10pm

movie2,下午5点,晚上8点

movie3,下午3点,晚上7点,晚上10点

我想我想将每一行拆分成自己的数组,也许是数组的一个arraylist?我真的不知道从哪里开始所以任何指针都会受到赞赏。

最好不要使用任何外部库。

3 个答案:

答案 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(因此两者都是可变长度数组)。

它适用于我们在字段周围没有引号(当电影名称中有撇号或逗号时必需)。在我解决的问题中,所有行都具有相同数量的列,但在解析文件之前我不知道列数,并且每个文件通常具有不同数量的列和列名称,并且它完美地工作。