Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一种解析制表符分隔文件的策略_Java_Arrays_Parsing_Text Files - Fatal编程技术网

Java 一种解析制表符分隔文件的策略

Java 一种解析制表符分隔文件的策略,java,arrays,parsing,text-files,Java,Arrays,Parsing,Text Files,在Java中,解析制表符分隔文件的最原始方法是什么,这样表格数据就不会丢失结构?我不是在寻找一种使用Bean或Jsoup的方法,因为它们对我来说并不熟悉,是一个初学者。我需要关于它背后的逻辑和高效的方法的建议,例如,如果我有一张像 ID reference | Identifier | Type 1| Type 2 | Type 3 | 1 | red#01 | 15% | 20% | 10% | 2 | yel

在Java中,解析制表符分隔文件的最原始方法是什么,这样表格数据就不会丢失结构?我不是在寻找一种使用Bean或Jsoup的方法,因为它们对我来说并不熟悉,是一个初学者。我需要关于它背后的逻辑和高效的方法的建议,例如,如果我有一张像

ID reference | Identifier    | Type 1| Type 2  | Type 3 |
1            | red#01        | 15%   |  20%    | 10%    |
2            | yellow#08     | 13%   |  20%    | 10%    |
更正:在这个例子中,我有类型1-3,但我的问题适用于N个类型

我是否可以通过使用数组来实现表解析,或者Java中是否有一种更适合此任务的不同数据结构?我认为我应该这样做:

  • 扫描/读取
    “\t”
    处的第一行拆分,并创建一个字符串数组
  • 将该数组拆分为每个子数组包含1个表标题的子数组
  • 然后,开始读取表的下一行,并为每个子数组添加列中相应的值

  • 这个计划听起来是对的还是我把事情复杂化了/完全错了?有更简单的方法吗?(假设我仍然不知道如何将阵列拆分为子阵列,以及如何使用表中的值填充子阵列)

    我建议使用Apache Commons CSV包,如主页上所述:

    我建议使用Apache Commons CSV包,如主页所述:

    我会使用番石榴的拆分器和表格:


    我会用番石榴的切碎器和桌子:


    我强烈建议您为此使用read flat file解析库,如优秀的

    如果做不到这一点,下面是Java8中的一个解决方案

    首先,创建一个类来表示您的数据:

    static class Bean {
    
        private final int id;
        private final String name;
        private final List<Integer> types;
    
        public Bean(int id, String name, List<Integer> types) {
            this.id = id;
            this.name = name;
            this.types = types;
        }
    
        //getters 
    
    }
    
    静态类Bean{
    私有最终int id;
    私有最终字符串名;
    私有最终列表类型;
    公共Bean(int-id、字符串名称、列表类型){
    this.id=id;
    this.name=名称;
    this.types=类型;
    }
    //吸气剂
    }
    
    您关于使用各种列表的建议是基于脚本编写的。Java是面向对象的,所以你应该利用它来获得优势

    现在我们只需要解析文件:

    public static void main(final String[] args) throws Exception {
        final Path path = Paths.get("path", "to", "file.tsv");
        final List<Bean> parsed;
        try (final Stream<String> lines = Files.lines(path)) {
            parsed = lines.skip(1).map(line -> line.split("\\s*\\|\\s*")).map(line -> {
                final int id = Integer.parseInt(line[0]);
                final String name = line[1];
                final List<Integer> types = Arrays.stream(line).
                        skip(2).map(t -> Integer.parseInt(t.replaceAll("\\D", ""))).
                        collect(Collectors.toList());
                return new Bean(id, name, types);
            }).collect(Collectors.toList());
        }
    }
    
    publicstaticvoidmain(最终字符串[]args)引发异常{
    最终路径路径=Path.get(“Path”、“to”、“file.tsv”);
    解析的最终列表;
    try(最终流行=Files.lines(路径)){
    parsed=lines.skip(1).map(line->line.split(“\\s*\\\\\\\\\\s*”).map(line->{
    final int id=Integer.parseInt(第[0]行);
    最终字符串名称=行[1];
    最终列表类型=Arrays.stream(行)。
    跳过(2).map(t->Integer.parseInt(t.replaceAll(“\\D”,”))。
    collect(Collectors.toList());
    返回新Bean(id、名称、类型);
    }).collect(Collectors.toList());
    }
    }
    
    本质上,代码跳过第一行,然后在文件中的行上循环,每行:

  • 拆分分隔符上的行-似乎是
    |
    。这需要正则表达式,因此需要转义管道,因为它是一个特殊字符。此外,我们还使用分隔符之前/之后的任何空格
  • 通过解析数组元素,为每行创建一个
    新Bean
  • 首先将id解析为
    int
  • 下一个是名字
  • 最后,获取行的
    ,跳过前两个元素,并将其余元素解析为
    列表

  • 我将强烈地建议您为此使用一个read flat file解析库,比如优秀的

    如果做不到这一点,下面是Java8中的一个解决方案

    首先,创建一个类来表示您的数据:

    static class Bean {
    
        private final int id;
        private final String name;
        private final List<Integer> types;
    
        public Bean(int id, String name, List<Integer> types) {
            this.id = id;
            this.name = name;
            this.types = types;
        }
    
        //getters 
    
    }
    
    静态类Bean{
    私有最终int id;
    私有最终字符串名;
    私有最终列表类型;
    公共Bean(int-id、字符串名称、列表类型){
    this.id=id;
    this.name=名称;
    this.types=类型;
    }
    //吸气剂
    }
    
    您关于使用各种列表的建议是基于脚本编写的。Java是面向对象的,所以你应该利用它来获得优势

    现在我们只需要解析文件:

    public static void main(final String[] args) throws Exception {
        final Path path = Paths.get("path", "to", "file.tsv");
        final List<Bean> parsed;
        try (final Stream<String> lines = Files.lines(path)) {
            parsed = lines.skip(1).map(line -> line.split("\\s*\\|\\s*")).map(line -> {
                final int id = Integer.parseInt(line[0]);
                final String name = line[1];
                final List<Integer> types = Arrays.stream(line).
                        skip(2).map(t -> Integer.parseInt(t.replaceAll("\\D", ""))).
                        collect(Collectors.toList());
                return new Bean(id, name, types);
            }).collect(Collectors.toList());
        }
    }
    
    publicstaticvoidmain(最终字符串[]args)引发异常{
    最终路径路径=Path.get(“Path”、“to”、“file.tsv”);
    解析的最终列表;
    try(最终流行=Files.lines(路径)){
    parsed=lines.skip(1).map(line->line.split(“\\s*\\\\\\\\\\s*”).map(line->{
    final int id=Integer.parseInt(第[0]行);
    最终字符串名称=行[1];
    最终列表类型=Arrays.stream(行)。
    跳过(2).map(t->Integer.parseInt(t.replaceAll(\\D',“”)。
    collect(Collectors.toList());
    返回新Bean(id、名称、类型);
    }).collect(Collectors.toList());
    }
    }
    
    本质上,代码跳过第一行,然后在文件中的行上循环,每行:

  • 拆分分隔符上的行-似乎是
    |
    。这需要正则表达式,因此需要转义管道,因为它是一个特殊字符。此外,我们还使用分隔符之前/之后的任何空格
  • 通过解析数组元素,为每行创建一个
    新Bean
  • 首先将id解析为
    int
  • 下一个是名字
  • 最后,获取行的
    ,跳过前两个元素,并将其余元素解析为
    列表

  • 最简单的方法是使用bean和平面文件读取库。在某个时候,你必须学会如何做到这一点,所以要这样做。您计划如何编写更复杂的代码?总是重新发明轮子吗?最简单的方法是使用bean和平面文件读取库。在某个时候,你必须学会如何做到这一点,所以要这样做。您计划如何编写更复杂的代码?总是重新发明轮子?谢谢你的回答,但是如果我有3种以上的轮子,但有100种或更多,那我该怎么办呢?@nanachan,你应该做这个