Java CSV-计数#列

Java CSV-计数#列,java,csv,Java,Csv,开始时,我计算逗号的数量,如: stream.forEach(csvLine -> { int commaCounter = countMatches(csvLine, ","); if (commaCounter != FIELDS_IN_CSV - 1) { // Alert } 但我发现(谢谢你的bug)逗号被撇号包围时是一个合法字符,比如“这是一个,值” 我寻找了一个简单的方法来解决这个问题,但什么也没找到(如果有帮助的

开始时,我计算逗号的数量,如:

stream.forEach(csvLine -> {
    int commaCounter = countMatches(csvLine, ",");
    if (commaCounter != FIELDS_IN_CSV - 1) {
        // Alert
    }
但我发现(谢谢你的bug)逗号被撇号包围时是一个合法字符,比如
“这是一个,值”

我寻找了一个简单的方法来解决这个问题,但什么也没找到(如果有帮助的话,可以使用openCsv库)

当然,我可以迭代,将撇号*加入/退出堆栈,并计算单独的逗号。 这里有捷径吗

  • 或增加/减少撇号计数器值
    • 一个简单的自己动手解决方案是:

      int getFieldCount( String csvLine )
      {
          char[] ch = csvLine.toCharArray();
          int len = ch.length, pos = 0, commaCounter = 0;
          while ( pos < len )
          {
              char c = ch[pos];
              if ( c == ',' ) commaCounter++;
              else if ( c == '"' )
              {
                  pos++;
                  while ( pos < len && ch[pos] != '"' ) pos++; // skip everything until the end of the string (or line)
              }
              pos++;
          }
          return commaCounter;
      }
      
      int getFieldCount(字符串csvLine)
      {
      char[]ch=csvLine.toCharArray();
      int len=ch.length,pos=0,commaCounter=0;
      while(pos

      类似于上面的方法应该可以工作;)

      你的.csv的结构是什么?@Andrey,我不确定我是否理解你,常规的csv像a,b,c,d,但也可以是a,b,“c,2”,d@AsfK,CSV中的每一行可以有不同的逗号计数?这就是为什么你要检查所有线的计数吗?@munyul-the-Arch。要求是验证csv中的每一行有35个字段,当“a,b”等于一个字段时…您可以尝试使用Appache Commons csv读取您的.csv,它可以设置为忽略转义逗号,请参见此处-类似于我的DIY想法,谢谢!