Вам нужно иметь другое определение потока в вашем файле отображения для записи в файл CSV. Поток EmployeeInfo
может работать только с содержимым фиксированной длины, поскольку он настроен именно так.
Вам нужно добавить второе определение <stream>
для обработки CSV-файла, который вы хотите сгенерировать, и вашему BeanWriter
нужно сослаться на новый поток CSV вместо фиксированного размера.
Добавьте новое определение <stream>
в существующий файл mapping.xml:
<stream name="EmployeeInfoCSV" format="csv">
<record name="employee" class="com.aexp.gmnt.imc.record.submission.Employee" minOccurs="0" maxOccurs="unbounded">
<field name="firstName" />
<field name="lastName" />
<field name="title" />
</record>
</stream>
Обратите внимание на изменение имени <stream>
и format
, установленного на csv
. В этом определении <stream>
вы также можете изменить порядок, в котором данные записываются в файл CSV, если вы хотите, не затрагивая порядок вашего BeanReader
, в котором он ожидает чтения данных. Атрибуты length
, padding
и justify
не требуются для файла CSV.
Теперь вам нужно всего лишь изменить способ настройки BeanWriter
с:
BeanWriter out = factory.createWriter("EmployeeInfo", new File("C:\\Temp\\Soc\\output.csv"));
до
BeanWriter out = factory.createWriter("EmployeeInfoCSV", new File("C:\\Temp\\Soc\\output.csv"));
Обратите внимание на изменение в использовании имени потока csv в параметрах метода createWriter
.
Редактировать , чтобы ответить на этот вопрос из комментариев:
только что добавленный вопрос мне нужно добавить в качестве первой строки с заголовком
значения в качестве значений полей без записи их в качестве типа записи заголовка в
bean io, тогда возможно ли это через отражение или что-то еще?
Нет необходимости размышлять или прыгать через обручи, чтобы сделать это. Вы можете создать Writer
, который вы можете использовать, чтобы записать имена заголовков (столбцов) в файл, прежде чем передать записывающее устройство в BeanWriter
для добавления оставшихся выходных данных.
Вместо использования BeanWriter
, как указано выше:
BeanWriter out = factory.createWriter("EmployeeInfoCSV", new File("C:\\Temp\\Soc\\output.csv"));
Теперь вы бы сделали что-то вроде:
BufferedWriter writer = new BufferedWriter(new FileWriter(new File("C:\\Temp\\Soc\\output.csv")));
writer.write("First Name,Last Name,Title");
writer.newLine();
BeanWriter out = factory.createWriter("EmployeeInfoCSV", writer);
BeanIO
будет затем записывать свой вывод в writer
, который добавит данные в существующий файл. Не забудьте close()
и писателю, когда закончите.