连字符在CSV文件中的列之间分隔

时间:2015-04-25 09:18:51

标签: java csv hyphen

我有一个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);
    }
}

3 个答案:

答案 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++;
        }