使用Java在CSV文件中跳过空行

时间:2015-07-23 04:48:55

标签: java csv

我使用Scanner方法读取Java中的csv文件。并希望跳过输出中的空行。
我应该使用什么方法?

Scanner s=new Scanner(new File("file location"));
s.useDelimiter(",");

while(s.hasNext()){
 System.out.print(s.next());    
 System.out.print("|");
  System.out.print("\t");
 }
s.close();   

6 个答案:

答案 0 :(得分:0)

您可以按nextLine(以及有* 部分)浏览文件行,通过分隔符检查emptinesssplit字符串。< / p>

答案 1 :(得分:0)

如果一行为空,它将在文件的该行中包含(col - 1)分隔符。

例如,对于5列,空行将是第2行,其中(5-1)= 4个分隔符:

line1: 5,4,3,2,1
line2: ,,,,
line3: 1,2,3,4,5

因此,扫描每一行,按分隔符拆分,并忽略除非行的长度大于列数 - 1。

Scanner s=new Scanner(new File("file location"));

while(s.hasNextLine()){
    String line = s.nextLine();
    String[] cols = line.split(",");

    // if every col is empty, the line will equal col-1 delimiters.
    if(line.length() > cols.length - 1){ 
        for(String str : cols){
            System.out.print(str);    
            System.out.print("|");
            System.out.print("\t");
        }
    }
}
s.close();  

答案 2 :(得分:0)

如果您尝试为length打印s.next(),则可以找出造成这种情况的原因。它是由行尾字符\r\n引起的。因此,删除它们将产生预期的结果。

Scanner s=new Scanner(new File("1.csv"));
s.useDelimiter(",");
String contentRead="";
while(s.hasNext()){
   contentRead = s.next().replaceAll("\\r","");
   contentRead = contentRead.replaceAll("\\n","");
   if(!contentRead.isEmpty()){
      System.out.print(contentRead);    
      System.out.print("|");
      System.out.print("\t");
   }
}
s.close(); 

答案 3 :(得分:0)

使用以下代码解决您的问题,并在使用扫描仪

读取CSV时跳过空行
String line = "";
while (s.hasNext()) {
    if (!(line = s.nextLine()).isEmpty()) {
         System.out.print(line);
         System.out.print("|");
         System.out.print("\t");
    }
}

答案 4 :(得分:0)

Scanner类中没有可用的方法来实现此目的。

这里,而不是使用“,”作为分隔符,使用“\ n”作为分隔符。 这将有助于您在每次迭代中获得特定的行内容。

然后,您可以验证该特定行的内容是否适合您并按要求继续。

s.useDelimiter("\n");

while(s.hasNext())
{
   line = s.next();
   System.out.println("\nNext Line :" +line);

   //Here, tokenize the line and verify if any non-empty token exists

 }

答案 5 :(得分:0)

CSV可能很棘手:

  • 个别值可能包含换行符分隔符(例如v1,“v2 [\ n]和新行”,v3):如果使用nextLine()等效,则表示您赢了t正确解析数据。

  • 个别值可能包含分隔符(例如v1,“v2 [,]和更多东西”,v3):在这种情况下简单地依赖split()等效将产生多个值而不是一个。

  • 在多个平台上无法正确处理换行符(例如v1“v2 [\ r \ n]和新行”,v3):如果你在Linux中解析它或MACOS第二列将被解析为在 v2 之间产生一个空行和一个新行(即你将得到3行而不是2行)。

使用uniVocity-parsers附带的CSV解析器可靠地处理这些情况:

CsvParserSettings settings = new CsvParserSettings(); // many options here, check the tutorial.
settings.getFormat().setLineSeparator("\r\n");

CsvParser parser = new CsvParser(settings);
List<String[]> allRows = parser.parseAll(new FileReader(new File("path/to/file.csv")));

披露:我是这个图书馆的作者。它是开源和免费的(Apache V2.0许可证)。