CSV 文件中列之间的连字符分隔
Hyphen separated in between column in a CSV File
我有一个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);
}
}
这里有一些问题。首先,您忽略了拆分日期并仅检查年份。
其次,由于这些是字符串,您应该将它们与 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[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;
根据给定的数据,这段代码对我来说没有错误地完成了,但是你的错误表明你在第三列中有一行包含空值 - 你的完整数据是否包含数据中的空行,可能在末尾?
最好在整数解析步骤周围加上检查以防止出现这种情况:
if (f[2]!=null && !f[2].isEmpty()){
a[count]=Integer.parseInt(f[2]);
sum=sum+a[count];
count++;
}
也就是说,正如 Mureinik 所说,您的代码中还有其他错误会阻止您获得正确的答案 - 请注意单个等于是赋值,而不是比较:
if((f[4]="2010") != null)
我有一个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);
}
}
这里有一些问题。首先,您忽略了拆分日期并仅检查年份。
其次,由于这些是字符串,您应该将它们与 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[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;
根据给定的数据,这段代码对我来说没有错误地完成了,但是你的错误表明你在第三列中有一行包含空值 - 你的完整数据是否包含数据中的空行,可能在末尾?
最好在整数解析步骤周围加上检查以防止出现这种情况:
if (f[2]!=null && !f[2].isEmpty()){
a[count]=Integer.parseInt(f[2]);
sum=sum+a[count];
count++;
}
也就是说,正如 Mureinik 所说,您的代码中还有其他错误会阻止您获得正确的答案 - 请注意单个等于是赋值,而不是比较:
if((f[4]="2010") != null)