【问题标题】:Hyphen separated in between column in a CSV File连字符分隔在 CSV 文件的列之间
【发布时间】:2015-04-25 09:18:51
【问题描述】:

我有一个CSV文件,内容是这样的:

Country,Player,Runs,ScoreRate,MatchDate,Weekday,Ground,Versus,URL
Afghanistan,Mohammad Shahzad,118,97.52,16-02-2010,Tue,Sharjah CA Stadium,Canada,../Matches/MatchScorecard_ODI.asp?MatchCode=3087
Afghanistan,Mohammad Shahzad,110,99.09,01-09-2009,Tue,VRA Ground,Netherlands,../Matches/MatchScorecard_ODI.asp?MatchCode=3008
Afghanistan,Mohammad Shahzad,100,138.88,16-08-2010,Mon,Cambusdoon New Ground,Scotland,../Matches/MatchScorecard_ODI.asp?MatchCode=3164
Afghanistan,Mohammad Shahzad,82,75.92,10-07-2010,Sat,Hazelaarweg,Netherlands,../Matches/MatchScorecard_ODI.asp?MatchCode=3153

我必须找到阿富汗球员在 2010 年的总得分。

我写了一个代码,但是它的显示和异常和输出

java.lang.NumberFormatException: For input string: ""
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at A.main(A.java:38)
35135

但是,输出应该是 28 左右。

这里是代码。

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class A {

    public static void main(String args[]) throws FileNotFoundException
    {
        String csv="C:\\Users\\Dipayan\\Desktop\\odi-batting.csv";
        BufferedReader br=new BufferedReader(new FileReader(csv));

        String line=" ";
        int sum=0;
        int count=0;
        int []a=new int[10000];


        try {
            br.readLine();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            while((line=br.readLine())!=null)
                    {

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

                if((f[4]="2010") != null)
                {




                a[count]=Integer.parseInt(f[2]);
                sum=sum+a[count];
                count++;
                }
                    }
        } catch (NumberFormatException | IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println(sum);
    }
}

【问题讨论】:

  • if((f[4]="2010") != null) 对我来说没有意义。您正在将字符串“2010”分配给数组中位置 4 的元素,然后询问它是否不为 null,这将始终返回 true。

标签: java csv hyphen


【解决方案1】:

您的代码有两个问题。

您将在, 上进行拆分,这意味着f[4] 将包含- 分隔日期。您需要再次拆分f[4]。您可以从日期中提取year,如下所示:

String date = f[4];
String []dateComponents = null!=f[4] ? f[4].split("-"); : null;
String year = null!=dateComponents && dateComponents.length>=2 ? dateComponents[2] : "";

然后您可以在 if 语句中检查年份,如下所示:

if(year.equals("2010") && "Afghanistan".equals(f[0])) {
   ....
}

a[count]=Integer.parseInt(f[2]); :如果f[2] 中的值不是可解析的数字,则此语句可以抛出NumberFormatException。这很可能是您获得NumberFormatException 的原因。例如,考虑您的文件中有以下行:

Afghanistan,Mohammad Shahzad,abcd,97.52,16-02-2010,Tue,Sharjah CA Stadium,Canada,../Matches/MatchScorecard_ODI.asp?MatchCode=3087

在上述情况下,f[2] 将是 abcd,无法解析为数字。为了保护自己免受此类错误的影响,您可以在将 f[2] 解析为 int 之前检查它是否为数字:

int currCount = f[2].matches("-?\\d+(\\.\\d+)?") ? Integer.parseInt(f[2]) : 0;
a[count]=currCount;

【讨论】:

  • 我应该在哪里检查阿富汗?
  • 可能在地图上?开个玩笑,你这是什么意思?
  • 我要搜索阿富汗选手2010年的总成绩!在代码中,我只给出了 2010 年的条件。!我应该如何同时给出这两个条件的条件!这就是我要问的。
  • 编辑了我的答案。它可以保护您的代码免受其他答案未涵盖的异常的影响。
【解决方案2】:

这里有一些问题。首先,您忽略了拆分日期并仅检查年份。 其次,由于这些是字符串,您应该将它们与equals 方法进行比较。所以,while 循环的内容应该或多或少像这样:

String country = f[0];
String date = f[4];
String year = date.split("-")[2];    
if (country.equals("Afghanistan") && year.equals("2010")) {
    a[count] = Integer.parseInt(f[2]);
    sum += a[count];
    count++;
}

【讨论】:

  • f.split() 还是 date.split() ?它在您的代码中显示错误。
  • @DipyanDev 是的,应该是date.split - 很好,谢谢! (编辑我的答案来解决这个问题)
  • 我试过日期。但它显示错误的输出。 59086
  • 我应该在哪里检查阿富汗?
  • @DipyanDev 国家是 CSV 中的第一个字段。我编辑了我的答案以包括该检查。
【解决方案3】:

对于给定的数据,此代码对我来说完成没有错误,但您的错误表明您在第三列中有一个空值的行 - 您的完整数据是否在数据中包含一个空行,可能在末尾?

最好在整数解析步骤周围加上一个检查以防止出现这种情况:

        if (f[2]!=null && !f[2].isEmpty()){
            a[count]=Integer.parseInt(f[2]);
            sum=sum+a[count];
            count++;
        }

也就是说,正如 Mureinik 所说,您的代码中还有其他错误会阻止您获得正确答案 - 请注意,单个等号是一个分配,而不是比较:

        if((f[4]="2010") != null)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-09
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    相关资源
    最近更新 更多