Java Csv文件,每行包含不同数量的数据

Java Csv文件,每行包含不同数量的数据,java,arrays,csv,Java,Arrays,Csv,基本上,我试图存储文本文件中的数据,并用这些数据执行一些任务。到目前为止,我已经将数据解析为不同的类型(组件、库存数量、库存和价格),将数据加载到对象中,并将对象放入数组列表中。但是我有一个问题,因为txt文件中的一些行只有四种数据类型,而其他所有行都有五种 因此,我只能将其解析为四种数据类型,而不是5种,因为我得到了一个ArrayIndexOutOfBounds异常,因为二极管在索引[4]处没有任何内容。我知道我应该使用数组的长度,但我不确定如何使用。另外,我如何将数据类型(如stock)中的

基本上,我试图存储文本文件中的数据,并用这些数据执行一些任务。到目前为止,我已经将数据解析为不同的类型(组件、库存数量、库存和价格),将数据加载到对象中,并将对象放入数组列表中。但是我有一个问题,因为txt文件中的一些行只有四种数据类型,而其他所有行都有五种

因此,我只能将其解析为四种数据类型,而不是5种,因为我得到了一个
ArrayIndexOutOfBounds异常
,因为二极管在索引[4]处没有任何内容。我知道我应该使用数组的长度,但我不确定如何使用。另外,我如何将数据类型(如stock)中的所有内容相加,并获得所有组件的总库存?谢谢

    try
    {
        List<Inventory> invItem = new ArrayList<>();
        BufferedReader br = new BufferedReader(new FileReader("inventory.txt"));


        String fileRead = br.readLine();

        while (fileRead != null)
        {
            String[] tokenize = fileRead.split(",");
            String tempItem = tokenize[0];
            String tempNumber = tokenize[1];
            double tempStock = Double.parseDouble(tokenize[2]);
            double tempPrice = Double.parseDouble(tokenize[3]);
            double tempResist = Double.parseDouble(tokenize[4]);
            Inventory tempObj = new Inventory(tempItem, tempNumber, tempPrice, tempStock, tempResist);
            invItem.add(tempObj);
            fileRead = br.readLine();



        }
试试看
{
List invItem=new ArrayList();
BufferedReader br=新的BufferedReader(新的文件阅读器(“inventory.txt”);
字符串fileRead=br.readLine();
while(fileRead!=null)
{
String[]tokenize=fileRead.split(“,”);
字符串tempItem=tokenize[0];
字符串tempNumber=tokenize[1];
double tempStock=double.parseDouble(标记化[2]);
double temprice=double.parseDouble(标记化[3]);
double tempResist=double.parseDouble(标记化[4]);
存货tempObj=新存货(tempItem、tempNumber、tempPrice、tempStock、tempResist);
invItem.add(tempObj);
fileRead=br.readLine();
}

我在这里只使用了一些伪代码,因为您还没有向我们展示您迄今为止的尝试,来解释您需要做什么:

for each line in CSV-file {
  split line by ',' and store in array
  check first item in array =>
    if array[0].equals("diode") => create diode object from array of size 4
    if array[0].equals("capacitor") => create capacitor object from array of size 5
    ...
  store created object in a List<>
}
以及一些使用此类的代码:

public static void main(String[] args) {
    List<Inventory> invItem = new ArrayList<>();
    BufferedReader br = new BufferedReader(new FileReader("inventory.txt"));

    String fileRead;

    while ((fileRead = br.readLine()) != null) {
        invItem.add(new Inventory(fileRead.split(",")));
    }

    br.close();

    double totalStock = 0;
    for (Inventory inv : invItem) {
        totalStock += inv.getStock();
    }
    System.out.println(totalStock); // prints the total stock
}
publicstaticvoidmain(字符串[]args){
List invItem=new ArrayList();
BufferedReader br=新的BufferedReader(新的文件阅读器(“inventory.txt”);
字符串文件读取;
而((fileRead=br.readLine())!=null){
add(新目录(fileRead.split(“,”));
}
br.close();
双重总存量=0;
用于(库存存货:invItem){
totalStock+=存货获取库存();
}
System.out.println(totalStock);//打印总库存
}

避免
ArrayIndexOutOfBounds
的一个简单解决方案是…在尝试读取值之前检查长度。此代码可以帮助:

 double tempResist = tokenize.length <= 4 ? 0 : 
        Double.parseDouble(tokenize[4]);
而且,更好的是,您将拥有
的独立
电阻器
电容器
子类,并拥有一个
项解析器
类和一个
静态项解析(字符串[]标记)
方法,该方法解析公共位,并创建正确子类的对象,将剩余的令牌传递给其构造函数。在其构造函数中,电阻器会抱怨是否缺少值,而电容器会抱怨是否传递了过多的意外值。这也会抱怨“鸡”是读取的,因为将没有子类来解析其值


编辑:最好将
ItemParser
作为一个单独的类,而不是将该功能直接放在
Item
类中,因为这样可以在
Item
中添加新类型,而不必触及基本
Item
基类。

我认为,这是您可能看到的第一个数据问题,但是ally可能还有更多。尝试使用现有库,它解决了所有这些问题,如
apache commons
apache poi
等。参见示例,我想说它不是有效的csv格式,最简单的方法是,如果可能的话,只需在特定情况下添加空值,如果可能的话
 double tempResist = tokenize.length <= 4 ? 0 : 
        Double.parseDouble(tokenize[4]);
 double tempResist = "resistor".equals(tempItem) ? 0 : 
        Double.parseDouble(tokenize[4]);