我有一个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年找到Afganisthan球员的总得分。
我写了一段代码,但它的节目和异常以及输出
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);
}
}
答案 0 :(得分: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]);
:如果NumberFormatException
中的值不是可解析的数字,则此规则可以抛出f[2]
。这很可能是您获得NumberFormatException
的原因。例如,假设您的文件中包含以下行:
Afghanistan,Mohammad Shahzad,abcd,97.52,16-02-2010,Tue,Sharjah CA Stadium,Canada,../Matches/MatchScorecard_ODI.asp?MatchCode=3087
在上述情况下,f[2]
将为abcd
,无法解析为数字。为了防止此类错误,您可以在将其解析为int之前检查f[2]
是否为数字:
int currCount = f[2].matches("-?\\d+(\\.\\d+)?") ? Integer.parseInt(f[2]) : 0;
a[count]=currCount;
答案 1 :(得分:0)
这里有一些问题。首先,您忽略了分割日期并仅检查年份。
其次,由于这些是字符串,您应该将它们与$.when.apply(null, json.script.map(function(e) {
return $.getScript(e);
}))
.done(function( script, textStatus ) { success(json); })
.fail(function( jqxhr, settings, exception ) { errormessage( exception ); });
方法进行比较。因此,equals
循环的内容应该或多或少看起来像这样:
while
答案 2 :(得分:0)
根据给定的数据,此代码完成后没有错误,但是您的错误表明您在第三列中有一个空值的行 - 您的完整数据是否在数据中包含空行,可能在最后?< / p>
最好用一个检查来围绕整数解析步骤以防止这种情况:
Unable to read repository at http://pydev.sf.net/updates/content.xml.
sun.security.validator.ValidatorException: PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find
valid certification path to requested target
也就是说,正如Mureinik所说,你的代码中还有其他错误会阻止你得到正确的答案 - 请注意单个等号是一个赋值,而不是比较:
if (f[2]!=null && !f[2].isEmpty()){
a[count]=Integer.parseInt(f[2]);
sum=sum+a[count];
count++;
}