计算.csv文件Java

时间:2015-05-04 21:41:16

标签: java

我的任务是由我的教授编写一个程序来读取.csv文件(778行(包括标题行),8列)。 我需要: 1.编写一个方法来接收文件名作为参数,然后打印文件中的行数。

public void printNumberOfLinesInFile(String fileName)

  1. 编写一个方法来接收文件名作为参数,然后打印私立和非私立学院的数量。
  2. public void printNumberOfPrivateNonPrivateCollegesInFile(String fileName)

    1. 编写一个方法来接收文件的名称作为其参数,然后打印私立学院名称,其中包含最大的州学费。
    2. public void printMostExpensivePrivateCollegeInFile(String fileName)

      1. 编写一个方法来接收文件的名称作为其参数,然后打印出具有最大州外学费的非私立学院。
      2. public void printMostExpensiveNonPrivateCollegeInFile(String fileName)

        1. 编写一个方法来接收文件名作为参数,然后打印申请数量和私立和非私立学院接受的申请人数。
        2. public void printNumberOfApplications(String fileName)

          1. 编写一个方法来接收文件名作为参数,然后打印私人和非私立学院的以下信息。
          2. 书籍的平均费用。 房间的平均费用。 个人开支的平均值。

            public void printAverageOfExpenses(String fileName)

            免责声明:我不希望任何人为我做作业。我需要学习,所以当我毕业并进入工业界时,我可以运用我的知识。我只是想要一个提示或更好的方式来编写代码。

            到目前为止我的代码:

                public class Week14 
                {
            public String data;
            
            
            
            public void printNumberOfLinesInFile(String inFile) throws IOException
            {
                int collegeCount = 0;
                FileReader fileRead = new FileReader(inFile);
                BufferedReader bufferRead = new BufferedReader(fileRead);
                while(true)
                {
                    String line = bufferRead.readLine();
                    if(line == null)
                    {
                        break;
            
                    }
                    collegeCount++;
                    //System.out.println(line);
                }
                System.out.println(collegeCount-1 + " Colleges total.");
            }
            public void printNumberOfPrivateNonPrivateCollegesInFile(String inFile) throws IOException
            {
                int privateCount = 0;
                int nonprivateCount = 0;
                int count = 0;
                FileReader fileRead = new FileReader(inFile);
                BufferedReader bufferRead = new BufferedReader(fileRead);
                while((data = bufferRead.readLine())!= null)
                {
                    String line = bufferRead.readLine();
                    String [] lineItems = line.split(",");
                    for(int i = 0; i < line.length(); i++)
                    {
                        if(lineItems[i].equals("Yes"))
                        {
                            privateCount++;
                        }
                    }
            
                    break;
                }
                System.out.println(privateCount+" private Colleges.");
                System.out.println(nonprivateCount+ " non-private Colleges.");
            }
            
            public void printMostExpensivePrivateCollegeInFile(String inFile) throws FileNotFoundException, IOException
            {
                int mostExpensive = 0;
                int currentExpensive = 0;
                FileReader fileRead = new FileReader(inFile);
                BufferedReader bufferRead = new BufferedReader(fileRead);
                while((data = bufferRead.readLine())!= null)
                {
                    String line = bufferRead.readLine();
                    if(line.equals("OutstateTuition"))
                    {
                        System.out.println(line);
                    }
                    else
                    {
                        System.out.println(line);
                    }
                }
            
            
            
            }
            
            public void printMostExpensiveNonPrivateCollegeInFile(String fileName)
            {
            
            }
            
            public void printNumberOfApplications(String fileName)
            {
            
            }
            
            public void printAverageOfExpenses(String fileName)
            {
            
            }
            public static void main(String[] args) throws FileNotFoundException, IOException 
            {
                File inFile = new File("College.csv");
                FileReader fileReader = new FileReader(inFile);
                BufferedReader buffReader = new BufferedReader(fileReader);
                Week14 w1 = new Week14();
                //w1.printNumberOfLinesInFile("College.csv");
                w1.printNumberOfPrivateNonPrivateCollegesInFile("College.csv");
                //^^^The above line goes into an infinite loop^^^
                //w1.printMostExpensivePrivateCollegeInFile("College.csv");
            }
            

            }

            问题是,我一直在试图计算私立和非私立大学的数量。在我的方法printNumberOfPrivateNonPrivateCollegesInFile(第39行)中,我遇到了异常:java.lang.ArrayIndexOutOfBoundsException:8

            我已经问过我的教授我怎么能避免这种情况,我已经在网上找了问题,问题似乎在于iterator int'i'。我正试图遍历数组,'我'超出范围。当我把'1'放进去时

                if(lineItems[i].equals("Yes"))
            

            对于我的privateCount,来自privateCount的输出为67,(我认为由于某种原因它会计算单个字符)。

            我的问题是,遍历整个.csv文件以及访问各个列的最有效方法是什么,以便我可以计算并输出它们?

            非常感谢任何帮助。

            编辑:

            我更改了while循环:

                    while(true)
                    {
                    String line = bufferRead.readLine();
                    String [] lineItems = line.split(",");
                    if(line == null)
                    {
                        break;
                    }
            
                    for (String lineItem : lineItems) {
                        privateCount++;
                    }
            
                }
            

            现在我可以遍历整个.csv文件了,但是当我尝试计算时,我收到了一个java.lang.NullPointerException。

            编辑2: 我再次重做我的while循环,

                while(true)
                {
                    String line = bufferRead.readLine();
                    String [] lineItems = line.split(",");
            
                    for (String lineItem : lineItems) {
                        if (lineItem.equals("Yes")) {
                            privateCount++;
                        }
                    }
                    System.out.println(privateCount);
            
                }
            

            我现在正在计算privateCount的正确值,但是在<:p>处有一个NullPointerException

                String [] lineItems = line.split(",");
            

            并且循环不允许我在没有'break'语句的情况下将我的'echo'放在while循环之外。

3 个答案:

答案 0 :(得分:0)

    if(lineItems != null && lineItems.length>0){
      // do your loop 
    }  



 if (lineItem!= null && !lineItem.trim().equals("") && lineItem.equals("Yes")) {
                    privateCount++;
                }

最有可能阻止您的空问题

答案 1 :(得分:0)

    public void printNumberOfPrivateNonPrivateCollegesInFile(String inFile) throws IOException
{
    int privateCount = 0;
    int nonprivateCount = 0;

    FileReader fileRead = new FileReader(inFile);
    BufferedReader bufferRead = new BufferedReader(fileRead);
    try
    {
    while(true)
    {
        String line = bufferRead.readLine();
        String [] lineItems = line.split(",");
        //System.out.println(Arrays.toString(lineItems));
        for (String lineItem : lineItems) 
        {
            if (lineItem!= null && !lineItem.trim().isEmpty() && lineItem.equals("No"))
            {
                nonprivateCount++;
            }
            if (lineItem!= null && !lineItem.trim().isEmpty() && lineItem.equals("Yes")) 
            {
            privateCount++;
            }
        }
        //System.out.println(privateCount);

    }
    }
    catch(NullPointerException npe)
    {

    }
    System.out.println(privateCount);
    System.out.println(nonprivateCount);

}

修正了它。我现在只是捕获异常,所以它不那么烦人。谢谢大家的帮助。

答案 2 :(得分:0)

关于实际的行业级代码,并假设分配没有特别关注实际的CSV解码,我建议找到并使用库来处理低级解码,例如 #pragma mark - UITableViewDelegate - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath { return UITableViewAutomaticDimension; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { if ([tableView respondsToSelector:@selector(setLayoutMargins:)]) { return UITableViewAutomaticDimension; } else { return [self heightForCellAtIndexPath:indexPath]; } } ,{{ 1}}或CSV-module for Jackson

通过这种方式,您的代码可以专注于查找特定值的更有趣的部分,而不是像可能的转义和/或引用内容那样复杂的细节。

如果重点是CSV边缘情况,这不是使用方法;但是对于真正的生产代码,考虑到任务存在多个好的库,很有可能很少编写实际的低级解码部分。