CSVTools.java

package eu.javaexperience.csv;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;
import java.util.Map;
import java.util.Map.Entry;

import eu.javaexperience.datatable.DataTableStructure;
import eu.javaexperience.interfaces.simple.getBy.GetBy3;
import eu.javaexperience.text.StringTools;

public class CSVTools
{
	/**
	 * Visszatér az oszlop sorszámával.
	 * 
	 * A	=> 1
	 * B	=> 2
	 * C	=> 3
	 * Z	=> 25
	 * AA	=> 26
	 * AB	=> 27
	 * AZ	=> 51
	 * BA	=> 52
	 * */
	public static int getIndexByExcelColumn(String column_name)
	{
		if(null == column_name)
		{
			return -1;
		}
		
		column_name = column_name.toUpperCase();
		
		int ret = 0;
		int w = 0;
		for(int i=column_name.length()-1;i > -1;--i,++w)
		{
			char c = column_name.charAt(i);
			if('A' <= c && c <= 'Z')
			{
				ret += (int) (Math.pow(26, w)*(c - 'A' +1));
			}
			else
			{
				return -1;
			}
		}
		
		return ret-1;
	}
	
	private static final char[] increment(char[] in, int index)
	{
		if(in.length == 0)
		{
			return new char[]{'A'};
		}
		
		if(in[index] == 'Z')
		{
			in[index] = 'A';
			
			if(index == 0)
			{
				char[] ret = new char[in.length+1];
				ret[0] = 'A';
				for(int i=0;i<in.length;++i)
				{
					ret[i+1] = in[i];
				}
				return ret;
			}
			else
			{
				return increment(in, index-1);
			}
		}
		else
		{
			++in[index];
		}
		
		return in;
	}
	
	public static String[] generateColHeader(int n)
	{
		String[] ret = new String[n];
		
		char[] val = new char[0];
		for(int i=0;i<n;++i)
		{
			val = increment(val, val.length-1);
			ret[i] = new String(val);
		}
		
		return ret;
	}
	
	public static String removeUnnecessaryQuote(String str, char quote)
	{
		if(str == null)
			return null;
		
		if (str.startsWith("\uFEFF"))
			str = str.substring(1);

		if(str.indexOf(quote) == 0)
			str = str.substring(1);

		if(str.lastIndexOf(quote) == str.length()-1)
		{
			if(str.length() < 2)
				return "";
			else
				str = str.substring(0,str.length()-1);
		}
		
		return str;
	}
	
	public static void examinePrefixColumns(Collection<String> dst, Map<String, String> row, String prefix)
	{
		for(Entry<String, String> kv:row.entrySet())
		{
			if(kv.getKey().startsWith(prefix))
			{
				String val = kv.getValue();
				if(!StringTools.isNullOrTrimEmpty(val))
				{
					dst.add(val);
				}
			}
		}
	}
	
	public static final GetBy3<String, Object[], Integer, String> DATATABLE_ARRAY_EXAMINER = new GetBy3<String, Object[], Integer, String>()
	{
		@Override
		public String getBy(Object[] a, Integer b, String c)
		{
			return StringTools.toStringOrNull(a[b]);
		}
	};
	
	public static final String[] HEADER_READ_COLUMN_NAMES = generateColHeader(50);
	
	public static void writeDatatableToFile
	(
		String dstFile,
		DataTableStructure<Object[]> src
	)
		throws IOException
	{
		writeDatatableToFile
		(
			dstFile,
			src,
			DATATABLE_ARRAY_EXAMINER
		);
	}
	
	public static <T> void writeDatatableToFile
	(
		String dstFile,
		DataTableStructure<T> src,
		GetBy3<String, T, Integer, String> tableEntryExamine
	)
		throws IOException
	{
		try(PrintWriter pw = new PrintWriter(dstFile))
		{
			SimpleCSVOutput out = new SimpleCSVOutput(pw);
			String[] rowNames = src.getRowNames();
			
			out.putRow(rowNames);
			
			String[] drow = new String[rowNames.length];
			for(T t:src.getDataCursor())
			{
				for(int i=0;i<rowNames.length;++i)
				{
					drow[i] = tableEntryExamine.getBy(t, i, rowNames[i]);
				}
				
				out.putRow(drow);
			}
			
			pw.flush();
		}
	}
	
	public static void main(String[] args)
	{
		System.out.println(getIndexByExcelColumn("A"));
		System.out.println(getIndexByExcelColumn("B"));
		System.out.println(getIndexByExcelColumn("C"));
		System.out.println(getIndexByExcelColumn("Z"));
		System.out.println(getIndexByExcelColumn("AA"));
		System.out.println(getIndexByExcelColumn("AZ"));
		System.out.println(getIndexByExcelColumn("BA"));
		
		String[] cols = generateColHeader(1000);
		for(String s:cols)
		{
			System.out.println(s);
		}
	}
}