	public void openSource(ISource source, IDataSet dataSet) throws ETLException {
		this.dataSet = dataSet;
		if (!(source instanceof FileSource)) {
			throw new ETLException("Can not handle a source of this type - FileSource type required.");
		}
		FileSource fsrc = (FileSource)source;
		try {
			recordNumber = 0;
			reachedEnd = false;
			InputStream in = new FileInputStream(fsrc.getFile());
			if (fsrc.getEncoding() == null) {
				String encoding = null; 
				byte[] encoding_tag = new byte[2];
				if (in.read(encoding_tag, 0, 2) == 2 && encoding_tag[0] == -1 && encoding_tag[1] == -2) {
					encoding = "UTF-16LE";
				} else {
					in.reset();
				}
				fsrc.setEncoding(encoding);
			}
			reader  = new CSVReader(new BufferedReader(StreamDecoder.forInputStreamReader(in, fsrc.getFile(), fsrc.getEncoding())), separator, quoteChar, skipLines);
			if (containsHeader) {
				String[] header = reader.readNext();
				if (header == null) {
					reachedEnd = true;
				} else {
					expectedColumns = header.length;
					int idx = 0;
					for (String colName : header) {
						dataSet.addColumn(colName, idx++);
					}
				}
			}
		} catch (FileNotFoundException e) {
			throw new ETLException("Source file not found (" + source.getName() + ") : " + e, e);
		} catch (IOException e) {
			throw new ETLException("Error reading file (" + source.getName() + ") : " + e, e);
		}
	}

	public void openSource(ISource source, IDataSet dataSet) throws ETLException {
		this.dataSet = dataSet;
		if (!(source instanceof FileSource)) {
			throw new ETLException("Can not handle a source of this type - FileSource type required.");
		}
		FileSource fsrc = (FileSource)source;
		try {
			recordNumber = 0;
			reachedEnd = false;
			InputStream in = new FileInputStream(fsrc.getFile());
			if (fsrc.getEncoding() == null) {
				String encoding = null; 
				byte[] encoding_tag = new byte[2];
				if (in.read(encoding_tag, 0, 2) == 2 && encoding_tag[0] == -1 && encoding_tag[1] == -2) {
					encoding = "UTF-16LE";
				} else {
					in.close();
					in = new FileInputStream(fsrc.getFile());
				}
				fsrc.setEncoding(encoding);
			}
			reader  = new CSVReader(new BufferedReader(StreamDecoder.forInputStreamReader(in, fsrc.getFile(), fsrc.getEncoding())), separator, quoteChar, skipLines);
			if (containsHeader) {
				String[] header = reader.readNext();
				if (header == null) {
					reachedEnd = true;
				} else {
					expectedColumns = header.length;
					int idx = 0;
					for (String colName : header) {
						dataSet.addColumn(colName, idx++);
					}
				}
			}
		} catch (FileNotFoundException e) {
			throw new ETLException("Source file not found (" + source.getName() + ") : " + e, e);
		} catch (IOException e) {
			throw new ETLException("Error reading file (" + source.getName() + ") : " + e, e);
		}
	}
