All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jamel.dbf.processor.DbfProcessor Maven / Gradle / Ivy

There is a newer version: 0.3.0
Show newest version
package org.jamel.dbf.processor;

import java.io.BufferedInputStream;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

import org.jamel.dbf.DbfReader;
import org.jamel.dbf.exception.DbfException;
import org.jamel.dbf.structure.DbfDataType;
import org.jamel.dbf.structure.DbfField;
import org.jamel.dbf.structure.DbfHeader;
import org.jamel.dbf.utils.StringUtils;

import static org.jamel.dbf.utils.StringUtils.rightPad;

/**
 * @author Sergey Polovko
 */
public final class DbfProcessor {

    private static final int INDEX_WIDTH = 4;
    private static final int NAME_WIDTH = 16;
    private static final int TYPE_WIDTH = 8;
    private static final int LENGTH_WIDTH = 8;
    private static final int DECIMAL_WIDTH = 8;


    private DbfProcessor() {
    }

    public static  List loadData(File dbf, DbfRowMapper rowMapper) throws DbfException {
        try (DbfReader reader = new DbfReader(dbf)) {
            List result = new ArrayList<>(reader.getRecordCount());
            Object[] row;
            while ((row = reader.nextRecord()) != null) {
                result.add(rowMapper.mapRow(row));
            }

            return result;
        }
    }

    public static void processDbf(File dbf, DbfRowProcessor rowProcessor) throws DbfException {
        try (DbfReader reader = new DbfReader(dbf)) {
            Object[] row;
            while ((row = reader.nextRecord()) != null) {
                rowProcessor.processRow(row);
            }
        }
    }

    public static void writeToTxtFile(File dbf, File txt, Charset dbfEncoding) {
        try (
                DbfReader reader = new DbfReader(dbf);
                PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter(txt)))
            )
        {
            DbfHeader header = reader.getHeader();

            String[] titles = new String[header.getFieldsCount()];
            for (int i = 0; i < header.getFieldsCount(); i++) {
                DbfField field = header.getField(i);
                titles[i] = StringUtils.rightPad(field.getName(), field.getFieldLength(), ' ');
            }

            for (String title : titles) writer.print(title);
            writer.println();

            Object[] row;
            while ((row = reader.nextRecord()) != null) {
                for (int i = 0; i < header.getFieldsCount(); i++) {
                    DbfField field = header.getField(i);
                    String value = field.getDataType() == DbfDataType.CHAR
                            ? new String((byte[]) row[i], dbfEncoding)
                            : String.valueOf(row[i]);
                    writer.print(StringUtils.rightPad(value, field.getFieldLength(), ' '));
                }
                writer.println();
            }
        } catch (IOException e) {
            throw new DbfException("Cannot write .dbf file to .txt", e);
        }
    }

    /**
     * Create string with dbf information:
     *   - creation date
     *   - total records count
     *   - columns info
     * @param dbf  .dbf file
     * @return  string with dbf information
     */
    public static String readDbfInfo(File dbf) {
        try (DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream(dbf)))) {
            DbfHeader header = DbfHeader.read(in);
            StringBuilder sb = new StringBuilder(512);
            sb.append("Created at: ")
                    .append(header.getYear()).append('-').append(header.getMonth())
                    .append('-').append(header.getDay()).append('\n')
                    .append("Total records: ").append(header.getNumberOfRecords()).append('\n')
                    .append("Header length: ").append(header.getHeaderLength()).append('\n')
                    .append("Columns: ").append('\n');

            sb.append("  ").append(rightPad("#", INDEX_WIDTH, ' '))
                    .append(rightPad("Name", NAME_WIDTH, ' '))
                    .append(rightPad("Type", TYPE_WIDTH, ' '))
                    .append(rightPad("Length", LENGTH_WIDTH, ' '))
                    .append(rightPad("Decimal", DECIMAL_WIDTH, ' '))
                    .append('\n');

            int totalWidth = INDEX_WIDTH + NAME_WIDTH + TYPE_WIDTH + LENGTH_WIDTH + DECIMAL_WIDTH + 2;
            for (int i = 0; i < totalWidth; i++) sb.append('-');

            for (int i = 0; i < header.getFieldsCount(); i++) {
                DbfField field = header.getField(i);
                sb.append('\n')
                        .append("  ").append(rightPad(String.valueOf(i), INDEX_WIDTH, ' '))
                        .append(rightPad(field.getName(), NAME_WIDTH, ' '))
                        .append(rightPad(String.valueOf((char) field.getDataType().byteValue), TYPE_WIDTH, ' '))
                        .append(rightPad(String.valueOf(field.getFieldLength()), LENGTH_WIDTH, ' '))
                        .append(rightPad(String.valueOf(field.getDecimalCount()), DECIMAL_WIDTH, ' '));
            }

            return sb.toString();
        } catch (IOException e) {
            throw new DbfException("Cannot read header of .dbf file " + dbf, e);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy