#java #parsing #univocity
#java #синтаксический анализ #однозначность
Вопрос:
У меня есть следующий файл .csv:
tt0102057, 6, 2010-06-19, Перехват
tt0102059, 7,2013-06-23, Отличные снимки!
tt0102070, 5, 2010-02-10, Хадсон Хоук
Мне нужно проанализировать значение из 1-го столбца в значение int, а не String. Итак, мне нужно пропустить первые два символа и принять остальные за целое число.
Как я могу это сделать, используя анализатор однозначности на этапе синтаксического анализа?
Код работает и сохраняет данные в beans:
BeanListProcessor<univMovie> rowProcessor = new BeanListProcessor<univMovie>(univMovie.class);
CsvParserSettings settings = new CsvParserSettings();
settings.getFormat().setLineSeparator("n");
settings.setProcessor(rowProcessor);
settings.setHeaderExtractionEnabled(true);
CsvParser parser = new CsvParser(settings);
parser.parse(new FileReader("src/main/resources/movie.csv"));
List<univMovie> beans = rowProcessor.getBeans();
Ответ №1:
У вас есть много вариантов:
Проще всего в вашем univMovie
классе добавить @Replace
аннотацию над полем, которое будет получать эти данные:
@Parsed
@Replace(expression = "tt", replacement = "")
int yourField;
Если ваши поля могут быть сложнее, а регулярное выражение не будет простым / понятным решением, вы можете поместить @Parsed
аннотацию к методу, который установит это поле для вас:
@Parsed
void setYourField(String value){
String cleanValue = someMethodToCleanYourValue(value);
yourField = Integer.parseInt(cleanValue);
}
Вы также можете указать процессору преобразовать несколько полей с:
rowProcessor.convertIndexes(Conversions.replace("tt", ""))
.set(0); //one or more indexes
Надеюсь, это поможет