package org.openswing.swing.importdata.java;
import java.io.*;
import java.util.*;
import java.text.*;
/**
* <p>Title: OpenSwing Framework</p>
* <p>Description: This class is used to import grid data from a text file having CSV format (with ";" or "," separator).</p>
* CSV is a delimited data format that has fields/columns separated by the comma character and records/rows separated by newlines.
* Fields that contain a special character ( comma, newline, or double quote ), must be enclosed in double quotes.
* However, if a line contains a single entry which is the empty string, it may be enclosed in double quotes.
* If a field's value contains a double quote character it is escaped by placing another double quote character next to it.
* The CSV file format does not require a specific character encoding, byte order, or line terminator format.
* <p>Copyright: Copyright (C) 2006 Mauro Carniel</p>
*
* <p> This file is part of OpenSwing Framework.
* This library is free software; you can redistribute it and/or
* modify it under the terms of the (LGPL) Lesser General Public
* License as published by the Free Software Foundation;
*
* GNU LESSER GENERAL PUBLIC LICENSE
* Version 2.1, February 1999
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* The author may be contacted at:
* maurocarniel@tin.it</p>
*
* @author Mauro Carniel
* @version 1.0
*/
public class ImportFromCSV {
private String format = null;
SimpleDateFormat sdfdate = null;
SimpleDateFormat sdftime = null;
SimpleDateFormat sdfdatetime = null;
public ImportFromCSV(String format,SimpleDateFormat sdfdate,SimpleDateFormat sdftime,SimpleDateFormat sdfdatetime) {
this.format = format;
this.sdfdate = sdfdate;
this.sdftime = sdftime;
this.sdfdatetime = sdfdatetime;
}
public ArrayList importData(int[] colTypes,ArrayList importAttrColumns,InputStream in) throws Throwable {
BufferedInputStream bis = new BufferedInputStream(in);
ArrayList rows = new ArrayList();
char c;
char lastchar = (char)-1;
char dq = '\"';
char nl = '\n';
char cr = '\r';
char delim = ',';
if (format.equals(ImportOptions.CSV_FORMAT2))
delim = ';';
StringBuffer sb = new StringBuffer();
boolean isnewline = false;
boolean escape = false;
ArrayList row = new ArrayList();
int ichar = -1;
while ( (ichar=bis.read()) != -1) {
c = (char)ichar;
if (c==dq) {
if (!escape)
escape = true;
else if (sb.length()>0 && sb.charAt(sb.length()-1)==dq)
;
else
sb.append(dq);
}
else if (c==delim) {
if (!escape) {
row.add(sb);
sb = new StringBuffer();
}
else {
if (sb.length()>0 && sb.charAt(sb.length()-1)==dq) {
sb = sb.delete(sb.length()-1,sb.length()-1);
escape = false;
}
else
sb.append(delim);
}
}
else if (c==nl || c==cr) {
if (escape)
sb.append(c);
else if (lastchar!=nl && lastchar!=cr) {
row.add(sb);
sb = new StringBuffer();
escape = false;
isnewline = true;
}
}
else
sb.append(c);
// 123,abc,12-10-2008,,
// "12,3","""abc""",12-10-2008,"abc\ncde",
if (isnewline) {
isnewline = false;
rows.add( decodeRow(row,colTypes,importAttrColumns) );
row.clear();
}
lastchar = c;
}
if (row.size()>0) {
rows.add( decodeRow(row,colTypes,importAttrColumns) );
}
return rows;
}
private Object[] decodeRow(ArrayList row,int[] colTypes,ArrayList importAttrColumns) throws Throwable {
Object[] rowobj = new Object[importAttrColumns.size()];
for(int j=0;j<importAttrColumns.size();j++) {
rowobj[j] = row.size()>j?row.get(j).toString():null;
if (rowobj[j]!=null) {
if (rowobj[j].equals(""))
rowobj[j] = null;
else {
if (colTypes[j]==ImportOptions.TYPE_TEXT)
rowobj[j] = rowobj[j].toString();
if (colTypes[j]==ImportOptions.TYPE_DATE)
rowobj[j] = sdfdate.parse(rowobj[j].toString());
else if (colTypes[j]==ImportOptions.TYPE_DATE_TIME)
rowobj[j] = sdfdatetime.parse(rowobj[j].toString());
else if (colTypes[j]==ImportOptions.TYPE_TIME)
rowobj[j] = sdftime.parse(rowobj[j].toString());
else if (colTypes[j]==ImportOptions.TYPE_INT)
rowobj[j] = new Long(rowobj[j].toString());
else if (colTypes[j]==ImportOptions.TYPE_DEC)
rowobj[j] = new Double(rowobj[j].toString());
else if (colTypes[j]==ImportOptions.TYPE_CHECK)
rowobj[j] = rowobj[j];
else if (colTypes[j]==ImportOptions.TYPE_COMBO)
rowobj[j] = rowobj[j];
else if (colTypes[j]==ImportOptions.TYPE_LOOKUP)
rowobj[j] = rowobj[j];
else if (colTypes[j]==ImportOptions.TYPE_PERC)
rowobj[j] = new Double(rowobj[j].toString());
else if (colTypes[j]==ImportOptions.TYPE_CURRENCY)
rowobj[j] = new Double(rowobj[j].toString());
else if (colTypes[j]==ImportOptions.TYPE_FORMATTED_TEXT)
rowobj[j] = rowobj[j].toString();
else if (colTypes[j]==ImportOptions.TYPE_MULTI_LINE_TEXT)
rowobj[j] = rowobj[j].toString();
else if (colTypes[j]==ImportOptions.TYPE_PROGRESS_BAR)
rowobj[j] = new Double(rowobj[j].toString());
else if (colTypes[j]==ImportOptions.TYPE_COMBO_VO)
rowobj[j] = rowobj[j];
}
}
}
return rowobj;
}
}