protected void process() throws IOException {

		// INPUT file 1
		BufferedReader bfr = new BufferedReader(new InputStreamReader(
				new FileInputStream((String)file_input_old.getSelectedItem()), encoding_old.getSelectedItem().toString()));

		Modifier myModifier = new RegexModifier(">", 0, "\t");
		Reader modifyingReader = new ModifyingReader(bfr, myModifier);

		String[] next;
		String[] example = null;

		HashMap<String, String[]> oldmap = new HashMap<String, String[]>(10000);
		ArrayList templist = new ArrayList(10000);

		CSVReader reader = new CSVReader(modifyingReader, separator_old.getSelectedItem().toString().charAt(0), quote_old.getSelectedItem().toString().charAt(0));
		long time1 = System.currentTimeMillis();
		addlog(String.format("Lese Datei 1 von '%s' mit dem Zeichensatz %s", (String)file_input_old.getSelectedItem(), encoding_old.getSelectedItem().toString()));

		int key_column_old = 0;
		int maxlength = 0;

		while ((next = reader.readNext()) != null) {
			next = removeUnwanted(next);
			templist.add(next);

			if (next.length > maxlength) {
				maxlength = next.length;
				example = next;
			}
		}
		reader.close();
		modifyingReader.close();
		bfr.close();;

		showExample(example);
		if (JOptionPane.showConfirmDialog(this, "Beispielausgabe prüfen. Daten richtig erkannt?", "Prüfe Daten Datei 1", JOptionPane.YES_NO_OPTION) != JOptionPane.YES_OPTION) {
			return;
		}

		Object result = JOptionPane.showInputDialog(this, "Spalte für den Abgleich wählen", "Spalte für den Abgleich wählen", JOptionPane.QUESTION_MESSAGE, null, buildColSelect(example), "0");
		key_column_old = new Integer(result.toString()).intValue();

		Iterator<String[]> it = templist.iterator();
		while (it.hasNext()) {
			next = it.next();
			oldmap.put(next[key_column_old].trim(), next);
		}

		long time2 = System.currentTimeMillis();
		addlog(String.format("Einlesen von Datei 1 (%d) dauerte %d ms, %d s", oldmap.size(), time2 - time1, (time2 - time1) / 1000));

		HashMap<String, String[]> newmap = new HashMap<String, String[]>(10000);

		// INPUT file 2
		bfr = new BufferedReader(new InputStreamReader(new FileInputStream(
				(String)file_input_new.getSelectedItem()), encoding_new.getSelectedItem().toString()));

		myModifier = new RegexModifier(">", 0, "\t");
		modifyingReader = new ModifyingReader(bfr, myModifier);

		addlog(String.format("Lese Datei 2 von '%s' mit dem Zeichensatz %s", (String)file_input_new.getSelectedItem(), encoding_new.getSelectedItem().toString()));

		reader = new CSVReader(modifyingReader, separator_new.getSelectedItem().toString().charAt(0), quote_new.getSelectedItem().toString().charAt(0));
		time1 = System.currentTimeMillis();
		long records = 0;
//		boolean first = true;
		int key_column_new = key_column_old;

		// used for output file
//		String[] column_data_2 = null;
		while ((next = reader.readNext()) != null) {
			next = removeUnwanted(next);
			if (next.length != maxlength) {
				continue;
			}
//			if (first) {
//				column_data_2 = next;
//				first = false;
//			}
			if (!oldmap.containsKey(next[key_column_new].trim())) {
				newmap.put(next[key_column_new].trim(), next);
			}
			records++;
		}
		reader.close();
		modifyingReader.close();
		bfr.close();;

		time2 = System.currentTimeMillis();
		addlog(String.format("Processed %d datas. Found %d non-duplicates; took %d ms, %d s", records, newmap.size(), time2 - time1, (time2 - time1) / 1000));

		// OUTPUT file
		BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(
				new FileOutputStream((String)file_output.getSelectedItem()), encoding_out.getSelectedItem().toString()));
		CSVWriter writer = new CSVWriter(bfw, separator_out.getSelectedItem().toString().charAt(0), quote_out.getSelectedItem().toString().charAt(0));

		// headline
		ArrayList<String> l;
		l = new ArrayList<String>();

		String[] headline = new String[2];

		File infile1 = new File((String)file_input_old.getSelectedItem());
		File infile2 = new File((String)file_input_new.getSelectedItem());

		headline[1] = "";
		headline[1] = "Daten aus " + infile2.getName() + " nicht in " + infile1.getName();

		l.addAll(Arrays.asList(headline));
		String[] temp = l.toArray(new String[l.size()]);
		writer.writeNext(temp);

		l.clear();

		// data
		addlog(String.format("Schreibe Ausgabedatei nach '%s' mit Zeichensatz %s", (String)file_output.getSelectedItem(), encoding_out.getSelectedItem().toString()));

		TreeMap<String, String[]> writemap = new TreeMap<String, String[]>(new NaturalOrderComparator());
		writemap.putAll(newmap);

		it = writemap.values().iterator();
		while (it.hasNext()) {
			l.clear();
			next = (String[])it.next();

			l.addAll(Arrays.asList(next));
//			l.addAll(Arrays.asList(moreData));

			writer.writeNext(l.toArray(new String[l.size()]));
		}
		writer.close();
		addlog("Fertig.");

	}