尝试用Java解析大型TSV文件时出现奇怪的错误

问题描述 投票:0回答:1

我正在尝试使用基本的 Scanner 对象在 Java 中解析一个巨大的 tsv 文件(其中包含列表格式的 imdb 数据)。当我在解析时到达某个元素时,尽管原始文件似乎没有任何问题,但我收到“索引越界异常”。 这是我运行来获取数据的代码:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {

public static void main(String[] args) {
    String filePath = "G:/TSV/data.tsv";
    
    List<BasicsObject> basicsObjectsList = new ArrayList<>();
    
    try {
        Scanner scanner = new Scanner(new File(filePath));
        scanner.useDelimiter("\t");
        
        String first = scanner.nextLine();
        Integer i = 0;
        
        while(scanner.hasNextLine()) {
            i++;
            String line = scanner.nextLine();
            String[] fields = line.split("\t");
            if(fields.length < 7) {
                System.out.println(fields[0] + "\t" + fields[1] + "\t" + fields[2] + "\t" + fields[3] + "\t" + fields[4] + "\t" + fields[5] + "\t");
            }
            if (!"\\N".equals(fields[5]) && !"\\N".equals(fields[6])) {
                BasicsObject basicsObject = new BasicsObject(
                        fields[0],
                        Integer.valueOf(fields[5]),
                        Integer.valueOf(fields[6])
                );
                System.out.println(basicsObject.toString());
                basicsObjectsList.add(basicsObject);
            } else if (!"\\N".equals(fields[5]) && "\\N".equals(fields[6])) {
                BasicsObject basicsObject = new BasicsObject(
                        fields[0],
                        Integer.valueOf(fields[5]),
                        0
                );
                System.out.println(basicsObject.toString());
                basicsObjectsList.add(basicsObject);
            } else if ("\\N".equals(fields[5]) && !"\\N".equals(fields[6])) {
                BasicsObject basicsObject = new BasicsObject(
                        fields[0],
                        0,
                        Integer.valueOf(fields[6])
                );
                System.out.println(basicsObject.toString());
                basicsObjectsList.add(basicsObject);
            } else {
                BasicsObject basicsObject = new BasicsObject(
                        fields[0],
                        0,
                        0
                );
                System.out.println(basicsObject.toString());
                basicsObjectsList.add(basicsObject);
            }
            
        }
        
        System.out.println(i);
        scanner.close();
        
    }catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    System.out.println(basicsObjectsList.size());
}

}

为了打开该文件,我必须使用名为 LFTViewer5u 的专用程序,但我可以确认文件中的数据似乎没有损坏。以下是我遇到的问题的部分相关数据:

tt0000669   short   Cupid's Pranks  Cupid's Pranks  0   1908    \N  10  Comedy,Fantasy,Short
tt0000670   short   El curioso impertinente El curioso impertinente 0   1908    \N  12  Short
tt0000671   short   Desdemona   Desdemona   0   1908    \N  \N  Drama,Short

这是我的程序的输出,其中包含有问题的行和错误:

BasicsObject{tconst='tt0000669', startYear=1908, endYear=0}
tt0000670   short   El curioso impertinente El curioso impertinente 0   1908    
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 6 out of bounds for length 6
at Main.main(Main.java:29)

这是空白检测器结果:

java csv parsing java.util.scanner indexoutofboundsexception
1个回答
0
投票

我的旧 Eclipse IDE 在读取 TSV 文件时似乎出现了问题。我已经下载了 Intellij 并运行了给我带来错误的相同代码,但它运行完美。除了这个我不知道还能说什么。

© www.soinside.com 2019 - 2024. All rights reserved.