CsvConverter.java Source code

Java tutorial

Introduction

Here is the source code for CsvConverter.java

Source

/*
 * 
 * Copyright (c) 2004 SourceTap - www.sourcetap.com
 *
 *  The contents of this file are subject to the SourceTap Public License 
 * ("License"); You may not use this file except in compliance with the 
 * License. You may obtain a copy of the License at http://www.sourcetap.com/license.htm
 * Software distributed under the License is distributed on an  "AS IS"  basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
 * the specific language governing rights and limitations under the License.
 *
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 *
 */

import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;

import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

/**
 *
 * @author  Administrator
 * @version
 */
public class CsvConverter {
    private static String DELIM = ",";
    private String[] headers = null;
    private ArrayList data = new ArrayList();

    public CsvConverter(Reader in) {
        String line = "";
        boolean doHeader = true;
        StringTokenizer st = null;

        try {
            BufferedReader br = new BufferedReader(in);

            while ((line = br.readLine()) != null) {
                if (line == null) {
                    throw new IOException("Empty Data Source");
                }

                if (doHeader) {
                    headers = breakCSVStringApart(line);
                    doHeader = false;
                } else {
                    String[] rowArray = breakCSVStringApart(line);

                    if ((rowArray.length < headers.length) && (rowArray.length < 2)) {
                        //skip as blank row
                    } else {
                        data.add(rowArray);
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                in.close();
            } catch (Exception e) {
                ;
            }
        }
    }

    /**
     * DOCUMENT ME!
     *
     * @return 
     *
     * @throws IOException 
     */
    public String[] getHeader() throws IOException {
        return headers;
    }

    /**
     * DOCUMENT ME!
     *
     * @return 
     *
     * @throws IOException 
     */
    public ArrayList getData() throws IOException {
        return data;
    }

    /**
     * DOCUMENT ME!
     *
     * @param fileName 
     */
    public void writeToFile(String fileName) {
        try {
            FileWriter bwOut = new FileWriter(fileName);

            //write headers
            for (int i = 0; i < headers.length; i++) {
                bwOut.write(createCSVField(headers[i]));

                if (i != (headers.length - 1)) {
                    bwOut.write(",");
                }
            }

            bwOut.write("\n");

            //write data
            for (int i = 0; i < data.size(); i++) {
                String[] dataArray = (String[]) data.get(i);

                for (int j = 0; j < dataArray.length; j++) {
                    bwOut.write(createCSVField(dataArray[j]));

                    if (j != (dataArray.length - 1)) {
                        bwOut.write(",");
                    }
                }

                bwOut.write("\n");
            }

            bwOut.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * DOCUMENT ME!
     *
     * @param in 
     *
     * @return 
     */
    public String[] breakCSVStringApart(String in) {
        StringBuffer curString = new StringBuffer();
        List strings = new ArrayList();
        boolean escaped = false;
        boolean inquotedstring = false;

        for (int i = 0; i < in.length(); i++) {
            char c = in.charAt(i);

            switch (c) {
            case ',':

                if (inquotedstring) {
                    curString.append(',');
                } else {
                    strings.add(curString.toString().trim());
                    curString = new StringBuffer();
                }

            case ' ':

                // end word
                //if (inquotedstring) {
                curString.append(' ');

                //}
                break;

            case '\t':

                // end word
                if (inquotedstring) {
                    curString.append('\t');
                }

                break;

            case '"':

                if (escaped) {
                    curString.append('"');
                    escaped = false;
                } else if (inquotedstring) {
                    inquotedstring = false;

                    //strings.add(curString.toString());
                    //curString = new StringBuffer();
                } else {
                    inquotedstring = true;
                }

                break;

            case '\\':

                if (escaped) {
                    curString.append("\\");
                    escaped = false;
                } else {
                    escaped = true;
                }

                break;

            default:

                if (escaped) {
                    switch (c) {
                    case 'n':
                        curString.append('\n');

                        break;

                    case 't':
                        curString.append('\t');

                        break;

                    case 'r':
                        curString.append('\r');

                        break;

                    default:
                        break;
                    }

                    escaped = false;
                } else {
                    curString.append(c);
                }
            }
        }

        if (curString.length() > 0) {
            strings.add(curString.toString().trim());
        }

        return (String[]) strings.toArray(new String[0]);
    }

    /**
     * DOCUMENT ME!
     *
     * @param in 
     *
     * @return 
     */
    public static String createCSVField(String in) {
        StringBuffer curString = new StringBuffer();
        boolean needsQuotes = false;

        for (int i = 0; i < in.length(); i++) {
            char c = in.charAt(i);

            switch (c) {
            case '\n':
                curString.append("\\n");

                break;

            case '\t':
                curString.append("\\t");

                break;

            case '\r':
                curString.append("\\r");

                break;

            case ',':
                curString.append(",");
                needsQuotes = true;

                break;

            case '\\':
                curString.append("\\\\");

                break;

            case '"':
                curString.append("\\\"");

                break;

            default:
                curString.append(c);

                break;
            }
        }

        if (needsQuotes) {
            return "\"" + curString.toString() + "\"";
        } else {
            return curString.toString();
        }
    }
}