代码之家  ›  专栏  ›  技术社区  ›  AliCa

如何将csv文件映射到列表

  •  -2
  • AliCa  · 技术社区  · 2 年前

    我正在尝试读取CSV文件的内容并映射到 List<T> 哪里 T 与文件具有相同的列名。

    class InformationTypes{
        private String Title;
        private String Year;
        private List<String> Genre;
        private String RunTime;
        private String Rating;
        private String Votes;
        private String Director;
        private List<String> Cast;
    }
    
    private static List<List<InformationTypes>> allParts;
    

    以下是我如何尝试阅读和绘制地图:

    listInformationTypes = Files
                .lines(Paths.get("imdb.csv"))
                .map(line -> Arrays.asList(line.split(";")))
                .collect(toList());
    

    不幸的是,它没有起作用。我错过了什么?

    文件中的示例数据 imdb。csv :

    Title,Year,Genre,RunTime,Rating,Votes,Director,Cast,Gross
    
    In the Heat of the Night,1967,Crime;Drama;Mystery,110,7.9,68739,Norman Jewison,Sidney Poitier;Rod Steiger;Warren Oates;Lee Grant,24.38
    
    Forushande,2016,Drama,124,7.8,52643,Asghar Farhadi,Shahab Hosseini;Taraneh Alidoosti;Babak Karimi;Mina Sadati,2.4
    
    Rogue One,2016,Action;Adventure;Sci-Fi,133,7.8,564143,Gareth Edwards,Felicity Jones;Diego Luna;Alan Tudyk;Donnie Yen,532.18
    
    2 回复  |  直到 2 年前
        1
  •  2
  •   Abra BlueJK    2 年前

    如果你坚持使用 streams 然后基本上需要一个映射器函数来映射文件的每一行 imdb。csv 类的实例 InformationTypes .

    在下面的代码中,我使用 record (而不是类),只是为了让人们意识到自JDK 14以来它在Java中的存在。它简单地避免了编写方法,例如 equals toString (除其他外)。

    还请注意,我使用 method reference 调用 映射器 来自流处理代码的函数。

    我还更改了变量的名称,例如 Title title ,以便遵守 Java naming conventions .

    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    import java.util.Arrays;
    import java.util.List;
    import java.util.stream.Collectors;
    import java.util.stream.Stream;
    
    public record InformationTypes(String title,
                                   String year,
                                   List<String> genre,
                                   String runTime,
                                   String rating,
                                   String votes,
                                   String director,
                                   List<String> cast) {
    
        private static InformationTypes mapper(String line) {
            String[] parts = line.split(",");
            String title = parts[0];
            String year = parts[1];
            List<String> genre = Arrays.stream(parts[2].split(";"))
                                       .collect(Collectors.toList());
            String runTime = parts[3];
            String rating = parts[4];
            String votes = parts[5];
            String director = parts[6];
            List<String> cast = Arrays.stream(parts[7].split(";"))
                                      .collect(Collectors.toList());
            return new InformationTypes(title, year, genre, runTime, rating, votes, director, cast);
        }
    
        public static void main(String[] args) {
            Path path = Paths.get("imdb.csv");
            try (Stream<String> lines = Files.lines(path)) {
                List<InformationTypes> allParts = lines.skip(1L)
                                                       .map(InformationTypes::mapper)
                                                       .collect(Collectors.toList());
                allParts.forEach(System.out::println);
            }
            catch (IOException xIo) {
                xIo.printStackTrace();
            }
        }
    }
    

    这是我使用您问题中的示例数据运行上述代码时得到的输出。

    InformationTypes[title=In the Heat of the Night, year=1967, genre=[Crime, Drama, Mystery], runTime=110, rating=7.9, votes=68739, director=Norman Jewison, cast=[Sidney Poitier, Rod Steiger, Warren Oates, Lee Grant]]
    InformationTypes[title=Forushande, year=2016, genre=[Drama], runTime=124, rating=7.8, votes=52643, director=Asghar Farhadi, cast=[Shahab Hosseini, Taraneh Alidoosti, Babak Karimi, Mina Sadati]]
    InformationTypes[title=Rogue One, year=2016, genre=[Action, Adventure, Sci-Fi], runTime=133, rating=7.8, votes=564143, director=Gareth Edwards, cast=[Felicity Jones, Diego Luna, Alan Tudyk, Donnie Yen]]
    
        2
  •  1
  •   Zihan Wang    2 年前

    我建议您根据csv的数据模式创建对象,然后将单个记录转换为每个对象,这意味着每个记录都是一个对象。然后,您可以通过流读取csv并将每条记录保存到列表中。而不是将csv读取为字符串并与当前解决方案一起保存到列表。

    如果需要代码示例,请随时告诉我。