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

org.mwg.csv.CSVImporter Maven / Gradle / Ivy

There is a newer version: 11
Show newest version
package org.mwg.csv;

import org.mwg.Callback;
import org.mwg.Graph;
import org.mwg.Node;
import org.mwg.Type;
import org.mwg.csv.impl.CSVElement;
import org.mwg.csv.impl.Field;
import org.mwg.csv.impl.Mapper;

import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;

public class CSVImporter {

    private final String COMMA = ",";
    private String SEP;
    private int groupSize = 1;
    private Mapper mapper;

    private boolean verbose;

    public CSVImporter() {
        SEP = COMMA;
        mapper = new Mapper();
    }

    public void setSeparator(String newSeparator) {
        SEP = newSeparator;
    }

    public void setVerbose() {
        verbose = true;
    }

    public void groupBy(int p_groupSize) {
        this.groupSize = p_groupSize;
    }

    public KMapper mapper() {
        return mapper;
    }

    public void importToNode(final File csvFile, final Node targetNode, final Callback callback) throws IOException {
        mapper.nodeResolver(new KNodeResolver() {
            @Override
            public void resolve(Graph graph, Map headers, String[] values, long toResolveWorld, long toResolveTime, Callback callback) {
                graph.lookup(targetNode.world(), toResolveTime, targetNode.id(), callback);
            }
        });
        importToGraph(csvFile, targetNode.graph(), targetNode.world(), callback);
    }

    public void importToGraph(final File csvFile, final Graph targetGraph, final long targetWorld, final Callback callback) throws IOException {

        BufferedReader reader = new BufferedReader(new FileReader(csvFile));

        String header = reader.readLine();
        if (header == null) {
            if (callback != null) {
                callback.on(false);
            }
        } else {

            final long startingTimestamp = System.currentTimeMillis();

            final AtomicLong counter = new AtomicLong(0);
            final AtomicLong waiter = new AtomicLong(0);
            final AtomicBoolean isfinished = new AtomicBoolean(false);
            final Callback injectCallback = new Callback() {
                @Override
                public void on(Object result) {
                    long current = counter.incrementAndGet();
                    if (isfinished.get() && waiter.get() == current) {
                        if (callback != null) {
                            System.out.println("Import finished in " + (System.currentTimeMillis() - startingTimestamp) + " ms");
                            callback.on(true);
                        }
                    }
                }
            };

            StringTokenizer st = new StringTokenizer(header, SEP);
            String[] headers = new String[st.countTokens()];
            Map headersMap = new HashMap();

            if (verbose) {
                System.out.println("");
            }

            for (int i = 0; i < headers.length; i++) {
                headers[i] = st.nextToken();
                headersMap.put(headers[i], i);
                if (verbose) {
                    System.out.println("\t#" + i + ":<" + headers[i] + ">");
                }
            }
            if (verbose) {
                System.out.println("");
            }

            String[][] values = new String[groupSize][];
            int valueIndex = 0;
            String valueLine = reader.readLine();
            while (valueLine != null) {
                if (valueIndex == values.length) {
                    //process result
                    waiter.incrementAndGet();
                    inject(targetGraph, targetWorld, headersMap, values, transform(headersMap, values), injectCallback);

                    values = new String[groupSize][];
                    valueIndex = 0;
                }
                StringTokenizer loopSt = new StringTokenizer(valueLine, SEP);
                String[] loopValue = new String[loopSt.countTokens()];
                for (int i = 0; i < loopValue.length; i++) {
                    loopValue[i] = loopSt.nextToken();
                }
                values[valueIndex] = loopValue;
                valueIndex++;
                valueLine = reader.readLine();
            }
            reader.close();
            isfinished.set(true);
            //process old result
            if (valueIndex != 0) {
                waiter.incrementAndGet();
                inject(targetGraph, targetWorld, headersMap, values, transform(headersMap, values), injectCallback);
            }
        }
    }

    private void inject(Graph graph, long toResolveWorld, Map headers, String[][] lineElements, CSVElement[] elements, final Callback callback) {
        for (int i = 0; i < elements.length; i++) {
            final CSVElement current = elements[i];
            mapper.nodeResolver.resolve(graph, headers, lineElements[i], toResolveWorld, elements[i].time, new Callback() {
                @Override
                public void on(Node result) {
                    if (result != null) {
                        current.inject(result, verbose);
                        result.free();
                        callback.on(null);
                    } else {
                        System.err.println("Node not found !!!");
                    }
                }
            });
        }
    }

    private CSVElement[] transform(final Map headers, final String[][] lines) {
        final CSVElement[] result = new CSVElement[lines.length];
        for (int i = 0; i < lines.length; i++) {
            result[i] = new CSVElement();
            final String[] lineElements = lines[i];
            result[i].time = mapper.extractTime(headers, lineElements);
            final int finalI = i;

            for (String name : headers.keySet()) {
                final Integer index = headers.get(name);
                if (index < lineElements.length) {
                    Field field = (Field) mapper.getField(name);
                    if (field != null && !field.ignored) {
                        String fieldValue = lineElements[index];
                        if (mapper.globallyIgnoredValue == null || !mapper.globallyIgnoredValue.equals(fieldValue)) {
                            if (field.ignoredValue == null || !field.ignoredValue.equals(fieldValue)) {
                                Object converted = null;
                                if (field.transform != null) {
                                    converted = field.transform.transform(fieldValue);
                                } else {
                                    try {
                                        switch (field.type) {
                                            case Type.DOUBLE:
                                                converted = Double.parseDouble(fieldValue);
                                                break;
                                            case Type.LONG:
                                                converted = Long.parseLong(fieldValue);
                                                break;
                                            case Type.INT:
                                                converted = Integer.parseInt(fieldValue);
                                                break;
                                            default:
                                                converted = fieldValue;
                                        }
                                    } catch (Exception e) {
                                        e.printStackTrace();
                                    }
                                }
                                if (converted != null) {
                                    if (field.rename == null) {
                                        result[finalI].add(name, converted, field.type);
                                    } else {
                                        result[finalI].add(field.rename, converted, field.type);
                                    }
                                }
                            }
                        }
                    }
                }
            }

            if (verbose) {
                System.out.print("");
                for (int j = 0; j < lineElements.length; j++) {
                    if (j != 0) {
                        System.out.print("|");
                    }
                    System.out.print(lineElements[j]);
                }
                System.out.println("");
                if (result[i] != null) {
                    result[i].verbosePrint();
                }
            }
        }
        return result;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy