однозначность — Как разобрать строку из выбранного символа

#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
  

Надеюсь, это поможет