我的任务是由我的教授编写一个程序来读取.csv文件(778行(包括标题行),8列)。 我需要: 1.编写一个方法来接收文件名作为参数,然后打印文件中的行数。
public void printNumberOfLinesInFile(String fileName)
public void printNumberOfPrivateNonPrivateCollegesInFile(String fileName)
public void printMostExpensivePrivateCollegeInFile(String fileName)
public void printMostExpensiveNonPrivateCollegeInFile(String fileName)
public void printNumberOfApplications(String fileName)
书籍的平均费用。 房间的平均费用。 个人开支的平均值。
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循环之外。
答案 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边缘情况,这不是使用方法;但是对于真正的生产代码,考虑到任务存在多个好的库,很有可能很少编写实际的低级解码部分。