【问题标题】:Print specific lines(Words/numbers) from csv file从 csv 文件打印特定行(单词/数字)
【发布时间】:2015-12-28 04:40:21
【问题描述】:

假设我有这样的 CSV 文件:

Football Contest blabla bla,,,,,,, 
Team number1,Team number2,Points team1,Points team2,Red cards 
Sweden,France,1,2," 
Sweden,Brazil,3,5,2 
Sweden,Germany,2,2,3 
Sweden,Spain,3,5,"

在这个文件中,我只想打印出红牌的比赛。所以在这个例子中我想打印:
瑞典 - 巴西 = 2 瑞典 - 德国 = 3

这是我当前的代码,我坚持如何继续。

try {
    FileReader fr = new FileReader(file);
    BufferedReader br = new BufferedReader(fr);

    String lines = br.readLine();
    String result[] = lines.split(",");
    do{
        System.out.println();
    }while((lines = br.readLine()) != null); 

    //String result[] = lines.split(",");
    //System.out.println(result[1]);

    br.close();

}catch (FileNotFoundException e){
    System.out.println("File not found : "+ file.toString());
}catch (IOException e ){
    System.out.println("Unable to read file: "+ file.toString());
}

编辑我得到了帮助:

 while (line != null) {
        String result[] = line.split(",");
        if (result.length == 5) { //red cards present?
            System.out.println(result[0] + " - " + result[1] + " " + result[4]);
        }
        line = br.readLine(); //read next
    }

但我现在遇到的问题是,由于 csv 文件中的“”,它仍然会全部打印出来。为什么我不能做这样的事情?

    if (result[4] == "1,2,3,4,5" ){
System.out.println(result[0] + " - " + result[1] + " " + result[4]);
}

【问题讨论】:

  • 逐行读取,然后 line.split(","),分析值并输出您需要的内容
  • 要正确解析 CSV,请使用 opencsv 等库。否则,您将重新发明分词器和解析器。所有使用正则表达式和/或 split() 的建议都会产生无法处理 CSV 的所有有效表示的脆弱代码。

标签: java csv


【解决方案1】:

你可以这样试试 公共类 HelloWorld{

 public static void main(String []args){

String str1=  "Sweden,Brazil,3,5,4"; 
String str2="Sweden,Germany,2,2,3"; 
String str3="Football Contest blabla bla,,,,,,,";

String result1[]=str1.split(",");
String result2[]=str2.split(",");
String result3[]=str3.split(",");

      if(result1.length>=5){
          System.out.print(result1[0]+"-"+result1[1]+"="+result1[4]); 
          System.out.println();
      }
       if(result2.length>=5){
          System.out.print(result2[0]+"-"+result2[1]+"="+result2[4]); 
          System.out.println();
      }
       if(result3.length>=5){
          System.out.print(result3[0]+"-"+result3[1]+"="+result3[4]); 
          System.out.println();
      }




 }

}

【讨论】:

    【解决方案2】:

    为什么我不能做这样的事情?

       if (result[4] == "1,2,3,4,5" ){
    

    问题在于== 身份测试:它将比较result[4] 中的reference 是否与源代码中的常量相同reference .该表达式将永远是错误的。您需要检查是否相等,而不是身份:

    if (Objects.equals(result[4], "1,2,3,4,5")) {
    

    if (result[4] != null && result[4].equals("1,2,3,4,5")) {
    

    if ("1,2,3,4,5".equals(result[4])) {
    

    请注意,Objects.equals()(最终)已添加到 Java 8 中的 Java 标准库中。没有它,您必须在调用对象的 .equals() 方法之前防止出现 NullPointerException。传统上我更喜欢最后一个版本,因为在字符串文字上调用该方法意味着我可以确保它永远不会为空,并且会正常工作。

    【讨论】:

      【解决方案3】:

      您的 try-catch 块应如下所示:

          try {
              FileReader fr = new FileReader(file);
              BufferedReader br = new BufferedReader(fr);
      
              String line = br.readLine();
              while (line != null) {
                  String result[] = line.split(",");
                  if (result.length == 5 && result[4].matches("[0-9]")) { //red cards present? 
                      System.out.println(result[0] + " - " + result[1] + " " + result[4]);
                  }
                  line = br.readLine(); //read next
              }
              //close readers
              br.close();
              fr.close();
          } catch (FileNotFoundException e) {
              System.out.println("File not found : " + file.toString());
          } catch (IOException e) {
              System.out.println("Unable to read file: " + file.toString());
          }
      

      如果文件中有尾随空格,则必须先修剪字符串:result[4].trim().matches("[0-9]") 或使用另一个正则表达式:result[4].matches("\\d\\s")

      【讨论】:

      • 这让我朝着正确的方向前进。我可以这样“如果”在那个特定的位置寻找一个数字而不是检查长度吗?
      • @Dolle 现在我明白你的意思了。查看我编辑的代码:首先检查长度,然后检查数字。如果这有帮助,请点击上方箭头标记答案。
      • @Würgspaß如果我想要红牌超过 0-9?如果我喜欢 13 张红牌,我就不能让它发挥作用。因为 [0-13] 没有达到目标
      • @Dolle 好吧,这不是您最初问题的一部分。 “[0-9]”表示从 0 到 9 的任何 一个 数字。由于没有像“13”这样的 单个 数字,因此 [0-13] 无法工作。对于多个数字(并允许空格),请使用:result[4].matches("\\d*\\s*")
      【解决方案4】:

      试试这个:

      do {
           if (result[4]  instanceof Integer) { 
               System.out.print(result[0]+"="+result[1]+"="+result[4])
           }     
      } while ((lines = br.readLine()) != null);
      

      【讨论】:

      • 你确定吗? if (result[4] instanceof Integer) 将永远是 false
      【解决方案5】:

      如果你是红牌的索引,它看起来像整数,那么看看那个索引是否是整数,如果是,打印 0,1 和 4 index[0]=团队编号1 index[1]=团队编号2 index[4]=红牌

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-20
        • 1970-01-01
        • 1970-01-01
        • 2020-05-05
        • 2014-03-26
        • 2015-10-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多