All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.sta.cts.CSVScanner Maven / Gradle / Ivy

Go to download

Tool to convert CSV and XLS to XML, to transform XML and to convert XML to CSV, HTML, other text files, PDF etc., useful as command line tool and integrated in other projects.

There is a newer version: 3.119
Show newest version

package com.sta.cts;

import java.util.Vector;
import java.util.Hashtable;

import java.io.IOException;

/**
 * 

Name: CSVScanner

*

Description: * Die Klasse CSVScanner wurde von Scanner abgeleitet und realisiert einen * Scanner f?r CSV-Dateien. Als Token wird ein Vector geliefert, der alle * Elemente einer Zeile enth?lt (Strings). Leere Elemente werden durch leere * Strings dargestellt. *

*

Copyright: Copyright (c) 2001-2004, 2011, 2012, 2014, 2016-2019

*

Company: >StA-Soft<

* @author StA * @version 1.0 */ public class CSVScanner extends Scanner { /** * Das Trennzeichen, das zur Trennung der Elemente (Spalten) einer Zeile * verwendet wird. Standard: ?,?. */ private char comma; /** * True, falls leere Spalten durch den letzten "g?ltigen" Inhalt erg?nzt * werden sollen. */ private boolean auto; /** * Letzte zur?ckgelieferte und ggf. erg?nzte Zeile. */ private Vector myLastLine; /** * Zur Instantiierung eines CSV-Scanners. Als Trennzeichen wird ?,? * eingestellt. */ public CSVScanner() { setComma(','); auto = false; myLastLine = null; } /** * Zur Instantiierung eines CSV-Scanners. * @param pComma das zu verwendende Trennzeichen */ public CSVScanner(char pComma) { setComma(pComma); } /** * Zur Instantiierung eines CSV-Scanners. Als Trennzeichen wird ?,? * eingestellt. * @param pFileName Name der Quelldatei * @throws IOException falls die Datei nicht gefunden wurde. */ public CSVScanner(String pFileName) throws IOException { setComma(','); init(pFileName); } /** * Zur Instantiierung eines CSV-Scanners. * @param pComma das zu verwendende Trennzeichen * @param pFileName Name der Quelldatei * @throws IOException falls die Datei nicht gefunden wurde. */ public CSVScanner(char pComma, String pFileName) throws IOException { setComma(pComma); init(pFileName); } /** * Zur Initialisierung des CSV-Scanners, Einstellen des Trennzeichens. * @param pComma das zu verwendende Trennzeichen */ void setComma(char pComma) { comma = pComma; } /** * Zur Initialisierung des CSV-Scanners mit Optionen aus der DTD. * Erlaubt sind bisher: * delimiter (ein Zeichen) * auto (yes|no) * overread (eine Anzahl von Zeilen) * @param pHT ist eine Hash-Table, die als Schl?ssel die Attributnamen * und als Werte die Einstellungen enth?lt (alles Strings). */ @Override public void initH(Hashtable pHT) { String s; s = (String) pHT.get("delimiter"); if (s != null) { setComma(s.charAt(0)); } s = (String) pHT.get("auto"); if (s != null) { auto = (s.equals("yes")); } s = (String) pHT.get("overread"); if (s != null) { int j = new Integer(s).intValue(); int i; for (i = 1; i <= j; i++) { getToken(); } } } /** * Ein Teil-Element scannen bis Begrenzungszeichen erreicht (wird verarbeitet). * @param pCh das Begrenzungszeichen * @return ein String, der alle gelesenen Zeichen bis excl. dem Trennzeichen * enth?lt. * @throws IOException falls ein Lesefehler auftritt */ String scanSubElement(char pCh) throws IOException { // OptimizeIt // String e = ""; StringBuilder sb = new StringBuilder(); boolean ex = false; char ch; do { ch = getChar(); if (ch == pCh) { ch = getChar(); if (ch == pCh) { // OptimizeIt // e = e + ch; sb.append(ch); } else { ungetChar(ch); ex = true; } } else { if ((ch == 0x0d) || (ch == 0x0a) || (ch == 0x00)) { ungetChar(ch); ex = true; } else { // OptimizeIt // e = e + ch; sb.append(ch); } } } while (!ex); // OptimizeIt // return e; return sb.toString(); } /** * Ein Element scannen. * * Begrenzungen sind: Trennzeichen "Comma" und Zeilenende. * * Trennzeichen werden nicht mit verarbeitet. * @return ein String, der das gelesene Element excl. Trennzeichen enth?lt * @throws IOException falls ein Lesefehler auftritt. */ String scanElement() throws IOException { String res = ""; char ch; ch = getChar(); while (ch == ' ') // || (ch == 0x09) { ch = getChar(); } if (ch != comma) { if (ch == '"') // || (ch == '\'') { res = scanSubElement(ch); } else { // wegen Zeilenende und Dateiende: StringBuilder sb = new StringBuilder(); while ((ch != comma) && (ch != 0x0d) && (ch != 0x0a) && (ch != 0x00)) { // OptimizeIt // e = e + ch; sb.append(ch); ch = getChar(); } // OptimizeIt // e = e.trim(); res = sb.toString().trim(); ungetChar(ch); } } else { ungetChar(ch); } // if (XDebug) MLogger.deb(" Element: " + e); return res; } /** * Scannen einer Zeile ohne abschlie?endes CRLF. * * Ergebnis ist ein Vector. * * Es wird ein Line-Tag als erstes Element im Vector geliefert ("Line"). * @return ein Vector of Strings, der die einzelnen Elemente der Zeile * enth?lt. * @throws IOException falls ein Lesefehler auftritt */ Vector scanLine() throws IOException { Object elem; Vector elements = new Vector(); char ch; // Idee: // ?berlies alle leeren Zeilen und Zeilen, die nur aus Spaces bestehen // Wird dabei das Dateiende erreicht, wird mit Ergebnis null abgebrochen. do { ch = getChar(); if (ch == 0x00) { return null; } } while ((ch == 0x0d) || (ch == 0x0a) || (ch == ' ')); ungetChar(ch); /* ch = getChar(); if (ch == 0x00) return null; ungetChar(ch); */ elements.add("Line"); // Line-Tag // if (XDebug) MLogger.deb("Line ..."); do { elem = scanElement(); if (elem != null) { elements.add(elem); } ch = getChar(); } while (ch == comma); ungetChar(ch); // if (XDebug) MLogger.deb("Line: Ok."); return elements; } /** * Ein neues "Token" ermitteln. * * Scannen einer Zeile. * * Verarbeiten des abschlie?enden CRLF. * * Wenn alle Elemente leer sind, ist wahrscheinlich das Dateiende erreicht. * * Falls das Dateiende vor dem Scannen erreicht ist, wird "null" geliefert. * @return ein Token */ @Override public Object getNewToken() { Object line; char ch; line = null; try { line = scanLine(); /* do { ch = getChar(); } while ((ch == 0x0d) || (ch == 0x0a)); ungetChar(ch); */ } catch (IOException e) { } if ((auto) && (line != null)) { if ((line instanceof Vector) && (myLastLine != null)) { int llSize = myLastLine.size(); int lSize = ((Vector) line).size(); if (llSize < lSize) { lSize = llSize; } int i; for (i = 0; i < lSize; i++) { if (((Vector) line).elementAt(i).equals("")) { ((Vector) line).set(i, myLastLine.elementAt(i)); } } } myLastLine = new Vector((Vector) line); } return line; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy