Как записать файл с фиксированной длиной в CSV-файл с помощью bean-объекта со всеми значениями в разных столбцах записи - PullRequest
0 голосов
/ 27 июня 2019

Этот код может записывать данные в CSV-файл, но единственная проблема заключается в том, что данные записываются только в один столбец.

Я хочу, чтобы данные поступали в другой столбец. Я новичок в Bean IO и не могу понять это.

Я попробовал приведенный ниже код и не смог получить вывод в правильном формате:

public class XlsWriter {

public static void main(String[] args) throws Exception {

StreamFactory factory = StreamFactory.newInstance();




  factory.load("C:\\Users\\PV5057094\\Demo_workspace\\XlsxMapper\\src\\main\\resources\\Employee.xml");

          Field[] fields = Employee.class.getDeclaredFields();

          System.out.println("fileds" + fields.length);
          List<Object> list = new ArrayList<Object>();
          for (Field field : fields) {

                 list.add(field.getName());

          }


          BeanReader in = factory.createReader("EmployeeInfo", new File("C:\\Temp\\Soc\\textInput.txt"));




          BeanWriter out = factory.createWriter("EmployeeInfo", new File("C:\\Temp\\Soc\\output.csv"));

          Object record;

          while ((record = in.read()) != null) {
                 System.out.println(record.toString().length());


                 out.write(record);

                 System.out.println("Record Written:" + record.toString());

          }

          in.close();
          out.flush();
          out.close();
   }


}

textInput.txt
AAAAABBBBBCCCCC
AAAAABBBBBCCCCC
AAAAABBBBBCCCCC
AAAAABBBBBCCCCC
AAAAABBBBBCCCCC



<?xml version="1.0" encoding="UTF-8"?>
<beanio xmlns="http://www.beanio.org/2012/03"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.beanio.org/2012/03 http://www.beanio.org/2012/03/mapping.xsd">

   <stream name="EmployeeInfo" format="fixedlength">

          <record name="employee"
                 class="com.aexp.gmnt.imc.record.submission.Employee" minOccurs="0"
                 maxOccurs="unbounded" order="1">
                 <field name="firstName" length="5" padding="0" justify="right" />
                 <field name="lastName"  length="5" padding="0" justify="right"/>
                 <field name="title" length="5" padding="0" justify="right"/>

          </record>
   </stream>

Я хочу, чтобы каждое значение записи находилось в другом столбце файла CSV, но в настоящее время это происходит только в одном столбце, пожалуйста, помогите.

1 Ответ

0 голосов
/ 27 июня 2019

Вам нужно иметь другое определение потока в вашем файле отображения для записи в файл 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() и писателю, когда закончите.

...