From a98b07458291c7d180d39c7e93b80d0475638742 Mon Sep 17 00:00:00 2001 From: "Thomas F. Sturm" Date: Fri, 11 Jul 2014 16:42:59 +0200 Subject: [PATCH] Windows native executable wrapping the Jar-archive added. --- build.number | 4 +- build.xml | 21 +++++- doc/csvsorter.tex | 67 ++++++++++++++--- src/tfs/csvsorter/CSVSorter.java | 28 +++++--- src/tfs/csvsorter/ColumnComparator.java | 1 + src/tfs/csvsorter/Configuration.java | 4 +- src/tfs/csvsorter/MultiColumnComparator.java | 65 +++++++++++++---- src/tfs/csvsorter/NumberName.java | 14 ++++ src/tfs/csvsorter/SingleColumnComparator.java | 72 ++++++++++++++----- 9 files changed, 218 insertions(+), 58 deletions(-) diff --git a/build.number b/build.number index dcdc6db..de715be 100644 --- a/build.number +++ b/build.number @@ -1,3 +1,3 @@ #Build Number for ANT. Do not edit! -#Wed Jul 09 12:24:35 CEST 2014 -build.number=52 +#Fri Jul 11 16:28:53 CEST 2014 +build.number=56 diff --git a/build.xml b/build.xml index 42507bd..fa116ea 100644 --- a/build.xml +++ b/build.xml @@ -4,8 +4,8 @@ CSV-Sorter ANT build - - + + @@ -13,6 +13,7 @@ + @@ -23,6 +24,11 @@ + + + @@ -152,13 +158,22 @@ + + + + + + + + - + + diff --git a/doc/csvsorter.tex b/doc/csvsorter.tex index 5ee7851..1b52285 100644 --- a/doc/csvsorter.tex +++ b/doc/csvsorter.tex @@ -1,5 +1,5 @@ % \LaTeX-Main\ -%% The csvsorter program - version 0.92-beta (2014/07/09) +%% The csvsorter program - version 0.93 beta (2014/07/11) %% csvsorter.tex: Manual %% %% Copyright (c) 2014, Prof. Dr. Dr. Thomas F. Sturm @@ -70,8 +70,8 @@ \usepackage[many,listings,minted]{tcolorbox} \usetikzlibrary{arrows.meta} -\def\version{0.92-beta}% -\def\datum{2014/07/09}% +\def\version{0.93 beta}% +\def\datum{2014/07/11}% \def\docdatum{\datum} \hypersetup{ @@ -296,7 +296,7 @@ \section{License} \clearpage \section{Installation} -\subsection{Basic Installation} + \csvsorter\ is written in Java and needs to have a Java virtual machine (version 1.6 or higher) installed. With some luck, you already have Java installed on your system. @@ -307,6 +307,13 @@ \subsection{Basic Installation} displays some Java version information, you have Java installed. Otherwise, you need to install a Java Runtime Environment to proceed. +\csvsorter\ is a portable program which needs not necessarily be installed in +some way. See Subsection~\ref{basiccommon} and Subsection~\ref{basicwindows} +how to execute \csvsorter. Further installation steps are found in Subsection~\ref{furtherinstallcommon} +and in Subsection~\ref{furtherinstallwindows}. + +\subsection{Basic Execution (platform-independent)}\label{basiccommon} + The \csvsorter\ is an executable Jar-archive named \comname{csvsorter.jar}. You can build \comname{csvsorter.jar} from the sources, but this is usually not necessary. @@ -323,7 +330,26 @@ \subsection{Basic Installation} If you get some Java errors, your installed virtual machine is probably too old and you have to update it to use \csvsorter\ . -\subsection{Further Installation} + +\subsection{Basic Execution (Windows)}\label{basicwindows} + +The \csvsorter\ is wrapped into a Windows native executable named \comname{csvsorter.exe}. +It does not provide a GUI and therefore cannot be started by double-clicking. +Instead, open a command console with \comname{cmd.exe}, change with it +to the directory where you saved \comname{csvsorter.exe}. +Execute the program on the command-line in this directory:\\ +\command*{csvsorter.exe} + +You should see something like\\ +\comname{This is CSV-Sorter} followed by\\ +\comname{Configuration file is missing.} and further text. +This means that you are ready to use \csvsorter\ +in the current directory. +If you get some Java errors, your installed virtual machine is probably too +old and you have to update it to use \csvsorter\ . + +\clearpage +\subsection{Further Installation (somewhat platform-independent)}\label{furtherinstallcommon} The further steps are optional and provide an easier use for \csvsorter\ . Instead of calling \command*{java -jar csvsorter.jar §options§}, you are @@ -343,12 +369,29 @@ \subsection{Further Installation} Put this \comname{csvsorter.cmd} to a directory which is part of your system path. If you do not know where to put this file, create a directory \comname{c:\bat}, put the file into it, and \emph{add} the new directory to -your path variable. A similar script file is recommended for Linux users. +your path variable. + +A similar script file is recommended for Linux users: + +\begin{xml}[title={csvsorter},minted language=bash] +#!/bin/bash +java -jar "/SOME PATH STRING/csvsorter.jar" $@ +# further: chmod u+x csvsorter +\end{xml} +\catcode`\Q=14 Q$ +\catcode`\Q=11 After these steps, \csvsorter\ is accessible system-wide by\\ \command*{csvsorter §options§} +\subsection{Further Installation (Windows)}\label{furtherinstallwindows} +Copy the \comname{csvsorter.exe} into a directory which is part of your +system path. If you intend to use it with the |csvsimple| \LaTeX\ package, +you could put it e.\,g.\ into the directory of the +\LaTeX\ binaries. + + \clearpage \section{Usage} Depending on the installation done in the last section, \csvsorter\ @@ -853,7 +896,15 @@ \subsection{Hierarchical brackets} \clearpage \section{Version History} -\versionbox[before=\par]{Version \version\ (\datum)} +%\versionbox[before=\par]{Version \version\ (\datum)} + +\versionbox[before=\par]{Version 0.93 beta (2014/07/11)} +\begin{changelist} +\item[new] Windows native executable wrapping the Jar-archive added. +\item[new] More log messages added. +\end{changelist} + +\versionbox{Version 0.92 beta (2014/07/09)} \begin{changelist} \item[fixed] Data loss, if input and output file are the same, corrected. \item[fixed] Descending string sorting corrected. @@ -865,7 +916,7 @@ \section{Version History} \item[new] Data type 'long' added. \end{changelist} -\versionbox[before=\par]{Version 0.91 beta (2014/07/05)} +\versionbox{Version 0.91 beta (2014/07/05)} \begin{changelist} \item[changed] Hierarchical bracket algorithm improved. \item[changed] Speed optimization for brackets (about 50 percent). diff --git a/src/tfs/csvsorter/CSVSorter.java b/src/tfs/csvsorter/CSVSorter.java index dae7409..2e0663b 100644 --- a/src/tfs/csvsorter/CSVSorter.java +++ b/src/tfs/csvsorter/CSVSorter.java @@ -31,9 +31,9 @@ public class CSVSorter static { - VERSION = "0.92-beta"; - DATE = "2014/07/09"; - BUILD = 51; + VERSION = "0.93 beta"; + DATE = "2014/07/11"; + BUILD = 55; PROGNAME = "CSV-Sorter"; } @@ -187,7 +187,7 @@ private void processCSV(Configuration configuration, PrintWriter log) throws Exc { for (int i=0;i"+headparts[i]+"<"); + log.println(" Column "+(i+1)+": \""+headparts[i]+"\""); } // Names to columns for (int i=0; i content = new ArrayList(); - ColumnComparator[] ccArray = configuration.getCcArray(); long ignoredLines = 0; String line = reader.readLine(); @@ -344,8 +348,9 @@ private PrintWriter createOutputWriter(Configuration configuration, PrintWriter public static void printUsageAndExit() { + System.out.println(""); System.out.println("Usage of CSV Sorter:"); - System.out.println("java -jar CSVsorter.jar OPTIONS"); + System.out.println("java -jar csvsorter.jar OPTIONS"); System.out.println(" where OPTIONS are the following:"); System.out.println(" -c configuration xml file (mandatory)"); System.out.println(" -l logfile"); @@ -353,8 +358,11 @@ public static void printUsageAndExit() System.out.println(" -o output csv file"); System.out.println(" -x input=output csv file"); System.out.println(""); - System.out.println("Example:"); - System.out.println("java -jar CSVsorter.jar -c myconf.xml -i example.csv -o examplesorted.csv"); + System.out.println("Example (all platforms):"); + System.out.println("java -jar csvsorter.jar -c myconf.xml -i example.csv -o examplesorted.csv"); + System.out.println(""); + System.out.println("Example (Windows):"); + System.out.println("csvsorter.exe -c myconf.xml -i example.csv -o examplesorted.csv"); System.out.println(""); System.out.println("Note: The configuration file may contain the rest of the options."); System.out.println(" Command line options override configuration file settings."); diff --git a/src/tfs/csvsorter/ColumnComparator.java b/src/tfs/csvsorter/ColumnComparator.java index 902cad3..56e5fb4 100644 --- a/src/tfs/csvsorter/ColumnComparator.java +++ b/src/tfs/csvsorter/ColumnComparator.java @@ -16,5 +16,6 @@ interface ColumnComparator public void config(HashMap nameToColumn, int maxNumber) throws Exception; + public String getDescription(); } diff --git a/src/tfs/csvsorter/Configuration.java b/src/tfs/csvsorter/Configuration.java index 602acbc..5026244 100644 --- a/src/tfs/csvsorter/Configuration.java +++ b/src/tfs/csvsorter/Configuration.java @@ -293,7 +293,7 @@ else if (elColumn.getNodeName().equals("sum")) private ColumnComparator makeColumnComparator(Element elColumn) throws Exception { NumberName numberName = new NumberName(elColumn); - String type = elColumn.getAttribute("type"); + String type = elColumn.getAttribute("type").toLowerCase(); boolean ascending = !(elColumn.getAttribute("order").toLowerCase().equals("descending")); String defaultString = elColumn.getAttribute("default"); @@ -327,7 +327,7 @@ else if (type.equals("string") || type.equals("")) private ColumnComparator makeSumColumnComparator(Element elSum) throws Exception { - String type = elSum.getAttribute("type"); + String type = elSum.getAttribute("type").toLowerCase(); boolean ascending = !(elSum.getAttribute("order").toLowerCase().equals("descending")); String defaultString = elSum.getAttribute("default"); diff --git a/src/tfs/csvsorter/MultiColumnComparator.java b/src/tfs/csvsorter/MultiColumnComparator.java index 393fa17..df5d2bf 100644 --- a/src/tfs/csvsorter/MultiColumnComparator.java +++ b/src/tfs/csvsorter/MultiColumnComparator.java @@ -11,14 +11,48 @@ abstract class MultiColumnComparator implements ColumnComparator { - NumberName[] numberNames; + private NumberName[] numberNames; + private boolean ascending; + private String type; + private String defaultValue; - public MultiColumnComparator(NumberName[] numberNames) throws Exception + public MultiColumnComparator(NumberName[] numberNames, boolean ascending, String type, String defaultValue) { this.numberNames = numberNames; + this.ascending = ascending; + this.type = type; + this.defaultValue = defaultValue; } + + public String getDescription() + { + String s = "Sort "+numberNames[0].getDescription(); + for (int i=1;i nameToColumn, int maxNumber) throws Exception { if (number<0) diff --git a/src/tfs/csvsorter/SingleColumnComparator.java b/src/tfs/csvsorter/SingleColumnComparator.java index 8bbad6e..b0ed0ca 100644 --- a/src/tfs/csvsorter/SingleColumnComparator.java +++ b/src/tfs/csvsorter/SingleColumnComparator.java @@ -17,11 +17,40 @@ abstract class SingleColumnComparator implements ColumnComparator { private NumberName numberName; + private boolean ascending; + private String type; + private String defaultValue; - public SingleColumnComparator(NumberName numberName) + public SingleColumnComparator(NumberName numberName, boolean ascending, String type, String defaultValue) { this.numberName = numberName; + this.ascending = ascending; + this.type = type; + this.defaultValue = defaultValue; + } + + + public String getDescription() + { + String s = "Sort "+numberName.getDescription()+" in "; + if (ascending) + { + s += "ascending"; + } + else + { + s += "descending"; + } + s += " order as "+type; + if (!defaultValue.equals("")) + { + return s + " (default: "+defaultValue+")."; + } + else + { + return s+"."; + } } @@ -63,11 +92,12 @@ long getDateValue(String[] parts, Locale locale) throws Exception @SuppressWarnings("rawtypes") public static SingleColumnComparator createIntegerComparator(NumberName numberName, boolean ascending, String defaultString) throws Exception { + final String type="integer"; if (ascending) { if (defaultString.equals("")) { - return new SingleColumnComparator(numberName) + return new SingleColumnComparator(numberName,ascending,type,defaultString) { public Comparable generateKey(String[] parts) throws Exception { @@ -78,7 +108,7 @@ public Comparable generateKey(String[] parts) throws Exception else { final Integer defaultKey = Integer.valueOf(defaultString); - return new SingleColumnComparator (numberName) + return new SingleColumnComparator(numberName,ascending,type,defaultString) { public Comparable generateKey(String[] parts) throws Exception { @@ -98,7 +128,7 @@ public Comparable generateKey(String[] parts) throws Exception { if (defaultString.equals("")) { - return new SingleColumnComparator (numberName) + return new SingleColumnComparator(numberName,ascending,type,defaultString) { public Comparable generateKey(String[] parts) throws Exception { @@ -109,7 +139,7 @@ public Comparable generateKey(String[] parts) throws Exception else { final Integer defaultKey = new Integer(-Integer.parseInt(defaultString)); - return new SingleColumnComparator (numberName) + return new SingleColumnComparator(numberName,ascending,type,defaultString) { public Comparable generateKey(String[] parts) throws Exception { @@ -132,11 +162,12 @@ public Comparable generateKey(String[] parts) throws Exception @SuppressWarnings("rawtypes") public static SingleColumnComparator createLongComparator(NumberName numberName, boolean ascending, String defaultString) throws Exception { + final String type="long"; if (ascending) { if (defaultString.equals("")) { - return new SingleColumnComparator(numberName) + return new SingleColumnComparator(numberName,ascending,type,defaultString) { public Comparable generateKey(String[] parts) throws Exception { @@ -147,7 +178,7 @@ public Comparable generateKey(String[] parts) throws Exception else { final Long defaultKey = Long.valueOf(defaultString); - return new SingleColumnComparator (numberName) + return new SingleColumnComparator(numberName,ascending,type,defaultString) { public Comparable generateKey(String[] parts) throws Exception { @@ -167,7 +198,7 @@ public Comparable generateKey(String[] parts) throws Exception { if (defaultString.equals("")) { - return new SingleColumnComparator (numberName) + return new SingleColumnComparator(numberName,ascending,type,defaultString) { public Comparable generateKey(String[] parts) throws Exception { @@ -178,7 +209,7 @@ public Comparable generateKey(String[] parts) throws Exception else { final Long defaultKey = new Long(-Long.parseLong(defaultString)); - return new SingleColumnComparator (numberName) + return new SingleColumnComparator(numberName,ascending,type,defaultString) { public Comparable generateKey(String[] parts) throws Exception { @@ -201,11 +232,12 @@ public Comparable generateKey(String[] parts) throws Exception @SuppressWarnings("rawtypes") public static SingleColumnComparator createDoubleComparator(NumberName numberName, boolean ascending, String defaultString) throws Exception { + final String type="double"; if (ascending) { if (defaultString.equals("")) { - return new SingleColumnComparator(numberName) + return new SingleColumnComparator(numberName,ascending,type,defaultString) { public Comparable generateKey(String[] parts) throws Exception { @@ -216,7 +248,7 @@ public Comparable generateKey(String[] parts) throws Exception else { final Double defaultKey = Double.valueOf(defaultString); - return new SingleColumnComparator (numberName) + return new SingleColumnComparator(numberName,ascending,type,defaultString) { public Comparable generateKey(String[] parts) throws Exception { @@ -236,7 +268,7 @@ public Comparable generateKey(String[] parts) throws Exception { if (defaultString.equals("")) { - return new SingleColumnComparator (numberName) + return new SingleColumnComparator(numberName,ascending,type,defaultString) { public Comparable generateKey(String[] parts) throws Exception { @@ -247,7 +279,7 @@ public Comparable generateKey(String[] parts) throws Exception else { final Double defaultKey = new Double(-Double.parseDouble(defaultString)); - return new SingleColumnComparator (numberName) + return new SingleColumnComparator(numberName,ascending,type,defaultString) { public Comparable generateKey(String[] parts) throws Exception { @@ -270,11 +302,12 @@ public Comparable generateKey(String[] parts) throws Exception @SuppressWarnings("rawtypes") public static SingleColumnComparator createDateComparator(NumberName numberName, final Locale locale, boolean ascending, String defaultString) throws Exception { + final String type="date"; if (ascending) { if (defaultString.equals("")) { - return new SingleColumnComparator(numberName) + return new SingleColumnComparator(numberName,ascending,type,defaultString) { public Comparable generateKey(String[] parts) throws Exception { @@ -285,7 +318,7 @@ public Comparable generateKey(String[] parts) throws Exception else { final Long defaultKey = new Long(DateFormat.getDateInstance(DateFormat.DEFAULT,locale).parse(defaultString).getTime()); - return new SingleColumnComparator (numberName) + return new SingleColumnComparator(numberName,ascending,type,defaultString) { public Comparable generateKey(String[] parts) throws Exception { @@ -305,7 +338,7 @@ public Comparable generateKey(String[] parts) throws Exception { if (defaultString.equals("")) { - return new SingleColumnComparator (numberName) + return new SingleColumnComparator(numberName,ascending,type,defaultString) { public Comparable generateKey(String[] parts) throws Exception { @@ -316,7 +349,7 @@ public Comparable generateKey(String[] parts) throws Exception else { final Long defaultKey = new Long(-DateFormat.getDateInstance(DateFormat.DEFAULT,locale).parse(defaultString).getTime()); - return new SingleColumnComparator (numberName) + return new SingleColumnComparator(numberName,ascending,type,defaultString) { public Comparable generateKey(String[] parts) throws Exception { @@ -339,9 +372,10 @@ public Comparable generateKey(String[] parts) throws Exception @SuppressWarnings("rawtypes") public static SingleColumnComparator createStringComparator(NumberName numberName, final Collator collator, boolean ascending) throws Exception { + final String type="string"; if (ascending) { - return new SingleColumnComparator(numberName) + return new SingleColumnComparator(numberName,ascending,type,"") { public Comparable generateKey(String[] parts) throws Exception @@ -352,7 +386,7 @@ public Comparable generateKey(String[] parts) throws Exception } else { - return new SingleColumnComparator (numberName) + return new SingleColumnComparator(numberName,ascending,type,"") { public Comparable generateKey(String[] parts) throws Exception {