Как пропустить строки без пробелов, используя Super CSV?
Как настроить Super CSV для пропуска пустых или пробелов?
Я использую CsvListReader и иногда получаю пустую строку в моих данных. Когда это происходит, исключение составляет:
количество CellProcessors должно соответствовать количеству полей
Я хотел бы просто пропустить эти строки.
2 ответа
Обновление: Super CSV 2.1.0 (выпущено в апреле 2013 г.) позволяет вам CommentMatcher
через настройки, которые позволят вам пропустить строки, которые считаются комментариями. Вы можете использовать 2 встроенных мэтчера, или вы можете поставить свои собственные. В этом случае вы можете использовать new CommentMatches("\\s+")
пропустить пустые строки.
Super CSV пропускает только строки нулевой длины (только ограничитель строки).
Это не действительный файл CSV, если есть пустые строки (см. Правило 4 RFC4180, которое гласит, что Each line should contain the same number of fields throughout the file
). Единственное время, когда пустая строка действительна, это если она является частью многострочного поля, окруженного кавычками. например
column1,column2
"multi-line field
with a blank line",value2
При этом, возможно, можно было бы сделать Super CSV немного более мягким с пустыми строками (он мог бы игнорировать их). Если бы вы могли опубликовать запрос функции на нашей странице SourceForge, мы можем исследовать это дальше и, возможно, добавить эту функцию в будущем выпуске.
Это не поможет вам прямо сейчас, хотя!
Я не проводил обширных тестов, но это должно сработать:) Вы можете написать свой собственный токенизатор, который пропускает пустые строки:
package org.supercsv.io;
import java.io.IOException;
import java.io.Reader;
import java.util.List;
import org.supercsv.prefs.CsvPreference;
public class SkipBlankLinesTokenizer extends Tokenizer {
public SkipBlankLinesTokenizer(Reader reader, CsvPreference preferences) {
super(reader, preferences);
}
@Override
public boolean readColumns(List<String> columns) throws IOException {
boolean moreInput = super.readColumns(columns);
// keep reading lines if they're blank
while (moreInput && (columns.size() == 0 ||
columns.size() == 1 &&
columns.get(0).trim().isEmpty())){
moreInput = super.readColumns(columns);
}
return moreInput;
}
}
И просто передайте это в конструктор вашего ридера (вам нужно будет передать настройки как в ридер, так и в токенизатор):
ICsvListReader listReader = null;
try {
CsvPreference prefs = CsvPreference.STANDARD_PREFERENCE;
listReader = new CsvListReader(
new SkipBlankLinesTokenizer(new FileReader(CSV_FILENAME), prefs),
prefs);
...
Надеюсь это поможет
Я не знал эту библиотеку (вы должны добавить тег Java...), но, глядя на примеры, я вижу, что у них есть читатели, поддерживающие переменное количество строк в строке. Пустая строка является частным случаем этого паттерна.
В качестве альтернативы (возможно, менее эффективного), вы можете просто поймать исключение и продолжить чтение...