2015-07-23 2 views
0

Я использую метод Scanner для чтения файла csv в Java. И хотите пропустить пустую строку на выходе.
Какой метод использовать?Пропустить пустую строку в CSV-файле с использованием Java

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(); 
+0

используйте этот код для решения проблемы Строка line = ""; while (s.hasNext()) { if (! (Line = s.nextLine()). IsEmpty()) { System.out.print (строка); System.out.print ("|"); System.out.print ("\ t"); } } –

ответ

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(); 
0

Вы можете пройти через строки файла по nextLine (и его имеют * части), проверьте emptiness и split строкового вашего разделителя.

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(); 
0

Используйте ниже код, чтобы решить вашу проблему и пропустить пустую строку при чтении CSV с помощью сканера

String line = ""; 
while (s.hasNext()) { 
    if (!(line = s.nextLine()).isEmpty()) { 
     System.out.print(line); 
     System.out.print("|"); 
     System.out.print("\t"); 
    } 
} 
+0

, который не будет работать, пустая строка в csv не является пустой строкой, это серия разделителей, между которыми нет ничего. – bcorso

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 

} 
0

CSV может быть сложно:

  • отдельные значения могут содержать перевод строки разделитель (например, v1, "v2 [\ п] и новая линия", v3): если вы используете эквивалент nextLine(), вы не будете правильно анализировать данные.

  • отдельные значения могут содержать разделитель (например, v1, «v2 [,] и больше материала», v3): в этом случае просто полагаться на раскол() эквивалент будет производить несколько значений вместо одного.

  • разрывы строки не будут обработаны должным образом на различных платформах (например, v1 «v2 [\ г \ п] и новая линия», v3): если вы разбираете это в Linux или MacOS второй столбец будет анализируется для создания пустой строки между v2 и и новой строкой (т.е. вы получите 3 строки вместо 2).

Используйте парсер CSV, который поставляется с uniVocity-parsers для обработки такого рода ситуациях надежно:

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).

Смежные вопросы