2015-01-26 1 views
0

Я написал программу, которая анализирует файл csv и создает компонент из данных, которые нужно поместить в базу данных. Все работает отлично, но теперь, когда это будет перенесено из тестовой среды, необходимо будет добавить настоящие имена заголовков из csv. Эти заголовки содержат пробелы и /. Я ищу способ позволить моему парсеру читать эти заголовки. Когда я определяю имена заголовков, я должен использовать camelCasing, и я не могу вставить пробелы или другие символы. Есть ли способ изменить это?Форматирование поля заголовка для bean-генератора - Java

Вот мой конструктор (integrationTeam должна быть интеграционная группа, softwareHardware должна быть Hardware/Software - как в заголовке CSV)

public class BeanGen { 

public BeanGen(
    final String name, 
    final String manufacturer, 
    final String model, 
    final String owner, 
    final String integrationTeam, 
    final String shipping, 
    final String hardwareSoftware, 
    final String subsystem,      
    final String plane, 
    final String integrationStandalone, 
    final String integrationInterface, 
    final String function, 
    final String helpLinks, 
    final String installationInstructions, 
    final String testSteps, 
    final String leadEngineer) 
    { 
    this.name = name; 
    this.manufacturer = manufacturer; 
    this.model = model; 
    this.owner = owner; 
    this.integrationTeam = integrationTeam; 
    this.shipping = shipping; 
    this.hardwareSoftware = hardwareSoftware; 
    this.subsystem = subsystem; 
    this.plane = plane; 
    this.integrationStandalone = integrationStandalone; 
    this.integrationInterface = integrationInterface; 
    this.function = function; 
    this.helpLinks = helpLinks; 
    this.installationInstructions = installationInstructions; 
    this.testSteps = testSteps; 
    this.leadEngineer = leadEngineer; 
    } 

Вот анализатор, который обрабатывает конструктору

public class ParseHandler { 

private static CellProcessor[] getProcessors() { 

    final CellProcessor[] processors = new CellProcessor[] { 

      new Optional(), 
      new Optional(), 
      new Optional(), 
      new Optional(), 
      new Optional(), 
      new Optional(), 
      new Optional(), 
      new Optional(), 
      new Optional(), 
      new Optional(), 
      new Optional(), 
      new Optional(), 
      new Optional(), 
      new Optional(), 
      new Optional(), 
      new Optional(), 
    }; 
    return processors; 
} 

public static BeanGen readWithCsvBeanReader(Path path) throws IOException { 
    ICsvBeanReader beanReader = null; 
    BeanGen projectBean = null; 
    System.out.println("Processing File: " + path); 
    try { 
     beanReader = new CsvBeanReader(new FileReader(path.toString()), CsvPreference.STANDARD_PREFERENCE); 
     // the header elements are used to map the values to the bean (names 
     // must match) 
     final String[] header = beanReader.getHeader(true); 
     final CellProcessor[] processors = getProcessors(); 

     if ((projectBean = beanReader.read(BeanGen.class, header, processors)) != null) { 
      System.out.println(String.format("%s", projectBean.toString())); 
     } 
    } finally { 
     if (beanReader != null) { 
      beanReader.close(); 
     } 
    } return projectBean; 
} 
} 
+1

Где ваш код, который выполняет синтаксический анализ csv и использует этот конструктор? –

+0

Пожалуйста, покажите нам код разбора. Какова связь между именами переменных в конструкторе 'BeanGen' и именами заголовков CSV? – vanje

+0

Элементы заголовка используются для сопоставления значений с компонентом. Имена заголовков должны точно совпадать или информация не будет найдена. Пока я тестировал это, мне пришлось изменить имена заголовков на то, как они отображаются. Когда эта программа будет использоваться, я не смогу это сделать, потому что в ней разбираются сотни csv - все имеют одинаковые заголовки, но содержат пробелы и символы. – jmpman

ответ

2

См Super CSV documentation, раздел Чтение с CsvBeanReader:

Это зависит от того, что имена столбцов в заголовке CSV-файла [...] совпадают точно с именами полей bean, и у компонента bean есть соответствующие сеттеры, определенные для каждого поля. Если ваш заголовок не соответствует (или нет заголовка), вы можете просто определить свой собственный массив сопоставления имен.

Вы читаете заголовок и передаете его beanReader.read() в качестве второго параметра. Но согласно API reference вторым параметром является массив строк, содержащий имена свойств компонента. Поэтому вы должны передать что-то вроде

new String[] { "name", "manufacturer", "model", "owner", "integrationTeam", ... } 

как второй параметр. Итак, первая столбец CSV соответствует полем бобов name, второе поле соответствует полем бобов manufacturer и т. Д.

+1

Вы можете увидеть пример игнорирования заголовка и предоставления своих собственных в [Частичных примерах чтения] (http://super-csv.github.io/super-csv/examples_partial_reading.html) на веб-сайте проекта. –

+0

А, спасибо. Трудно найти. – vanje