riessh
Returning Observer

CSV-Daten in Datenquelle importieren

Jump to solution

Hallo zusammen,
hier ist in mehreren Beiträgen die Rede von einem Basis-Script für den Import in eine Datenquelle. Kann mir hier jemand dies zur Verfügung stellen, oder bekommt man dies nur über den Helpdesk? Ich möchte eine CSV-Datei in eine vorhandene Datenquelle importieren.
Viele Grüße Holger

Labels (2)
Tags (2)
1 Solution

Accepted Solutions
oboeck
I'm new here

Re: CSV-Daten in Datenquelle importieren

Jump to solution

Hallo Holger,

die Infos die hier in der Community über ein Basis Script kursieren beziehen sich auf ein Script für die FS Version 3 welches man am HelpDesk erfragen kann.
Die Antwort vom HelpDesk (Stand 21.03.2017) ist allerdings dass dieses wie gesagt für die Version 3 ausgelegt ist und bei der Version 5.x nicht wirklich viel bringt.

Ansonsten existieren meines Wissens nach nur eigene Entwicklungen der jeweiligen Partnerfirmen. Und noch dieses Abstimmung dass solch ein Import über den Hersteller eingebaut werden soll. Allerdings kann ich nichts zum Stand sagen und ob e-Spirit diesen Wunsch in naher Zukunft berücksichtigen wird.

Generic CSV/XML Import/Export Script

Viele Grüße

Oliver Böck

View solution in original post

0 Kudos
8 Replies
oboeck
I'm new here

Re: CSV-Daten in Datenquelle importieren

Jump to solution

Hallo Holger,

die Infos die hier in der Community über ein Basis Script kursieren beziehen sich auf ein Script für die FS Version 3 welches man am HelpDesk erfragen kann.
Die Antwort vom HelpDesk (Stand 21.03.2017) ist allerdings dass dieses wie gesagt für die Version 3 ausgelegt ist und bei der Version 5.x nicht wirklich viel bringt.

Ansonsten existieren meines Wissens nach nur eigene Entwicklungen der jeweiligen Partnerfirmen. Und noch dieses Abstimmung dass solch ein Import über den Hersteller eingebaut werden soll. Allerdings kann ich nichts zum Stand sagen und ob e-Spirit diesen Wunsch in naher Zukunft berücksichtigen wird.

Generic CSV/XML Import/Export Script

Viele Grüße

Oliver Böck

0 Kudos
riessh
Returning Observer

Re: CSV-Daten in Datenquelle importieren

Jump to solution

Danke für die Info.

0 Kudos
felix_reinhold
Returning Responder

Re: CSV-Daten in Datenquelle importieren

Jump to solution

Hallo Holger,

das besondere am GenericCSVImporter war damals, dass er "Generic" war. Wenn du aber eh nur einen bestimmten Anwendungsfall hast, dann ist es vermutlich sowieso sinnvoll schnell ein eigenes kleines Skript zu schreiben, da ein CSV Import ja recht simpel ist. So ungefähr sollte das passen:

final String SCHEMA_NAME = "dein_schema_referenzname";

final String TABLE_NAME = "dein_tabellenname";

//Auswahl der CSV Datei

JFileChooser fileChooser = new JFileChooser();

fileChooser.setMultiSelectionEnabled(false);

int selection = fileChooser.showOpenDialog(null);

if (selection == JFileChooser.APPROVE_OPTION) {

  File file = fileChooser.getSelectedFile();

  // Ermitteln der Session, um darüber Entities zu erzeugen

  UserService uss = context.getUserService();

  Schema schema = uss.getTemplateStore().getSchemes().getSchemaByName(SCHEMA_NAME);

  Session session = schema.getSession();

  String tableName = schema.getOrSchema().getEntityType(TABLE_NAME).getName();

  // Auslesen der CSV Zeile pro Zeile

  BufferedReader reader = null;

  String line = "";

  try {

  reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));

  while ((line = reader.readLine()) != null) {

  // Datensatz erzeugen

  Entity ent = session.createEntity(tableName);

  String[] fields = line.split(";"); //Semikolon ggf. durch dein CSV-Trennzeichen ersetzen

  // Datensatz befüllen

  ent.setValue("spalte_1", fields[0]);

  ent.setValue("spalte_2", fields[1]);

  //usw...

  }

  session.commit();

   } catch (IOException e) {

  //Fehler beim auslesen der Datei

   } finally {

  //Reader schließen

   }

  context.logInfo("Fertig");

} else {

  context.logInfo("Keine Datei gewählt");

}

Gruß

Felix

0 Kudos
riessh
Returning Observer

Re: CSV-Daten in Datenquelle importieren

Jump to solution

Hallo Felix,

erst mal vielen Dank für das Script. HTML und CSS ist meine Welt. Firstspirit klappt mittlerweile auch ganz gut, aber JAVA - auweia. Deshalb kann ich auch mit der Fehlermeldung nicht so viel anfangen. Vielleicht kannst Du mir da weiter helfen.

Also ich habe jetzt folgendes getan.

- für Testzwecke eine neue Datenquelle angelegt,

- In der Vorlagenverwaltung unter Scripte ein neues Skript erstellt,

- Geltungsbereich: Menu

- und im jsp-Ausgabekanal Dein Scipt angepasst eingefügt.

Es scheint übrigens egal zu sein ob ich "//! Beanshell" in die erste Zeile schreibe oder nicht.

Wie macht man hier eigentlich Code aus den Zeilen?

final String SCHEMA_NAME = "sanacorp";
final String TABLE_NAME = "meatest";

//Auswahl der CSV Datei
JFileChooser fileChooser = new JFileChooser();
fileChooser.setMultiSelectionEnabled(false);
int selection = fileChooser.showOpenDialog(null);

if (selection == JFileChooser.APPROVE_OPTION) {
  File file = fileChooser.getSelectedFile();

  // Ermitteln der Session, um darüber Entities zu erzeugen
  UserService uss = context.getUserService();
  Schema schema = uss.getTemplateStore().getSchemes().getSchemaByName(SCHEMA_NAME);
  Session session = schema.getSession();
  String tableName = schema.getOrSchema().getEntityType(TABLE_NAME).getName();

  // Auslesen der CSV Zeile pro Zeile
  BufferedReader reader = null;
  String line = "";

  try {
  reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
  while ((line = reader.readLine()) != null) {
  // Datensatz erzeugen
  Entity ent = session.createEntity(tableName);
  String[] fields = line.split(";"); //Semikolon ggf. durch dein CSV-Trennzeichen ersetzen

  // Datensatz befüllen
  ent.setValue("name1", fields[0]);
  ent.setValue("datum1", fields[1]);
  ent.setValue("zahl1", fields[2]);

  //usw...
  }
  session.commit();
   } catch (IOException e) {
  //Fehler beim auslesen der Datei
   } finally {
  //Reader schließen
   }

  context.logInfo("Fertig");
} else {
  context.logInfo("Keine Datei gewählt");
}

Fehlermeldung: erscheint nach dem ich die zu importierende Datei ausgewählt habe.

Client Version: 5.1.605.72781
Java Version: 1.8.0_91 Oracle Corporation

FSVersion=5.1.605.72781#4692;JDK=1.8.0_91 32bit Oracle Corporation;OS=Windows 7 6.1 x86;Date=27.03.2017 10:30:45
de.espirit.firstspirit.access.script.ExecutionException: Typed variable declaration : Class: UserService not found in namespace : at Line: 14 : in file: inline evaluation of: ``__execute() { final String SCHEMA_NAME = "sanacorp"; final String TABLE_NAME = " . . . '' : UserService
at line 14
at de.espirit.firstspirit.server.script.BeanshellScriptEngine$BeanshellExecutable.execute(BeanshellScriptEngine.java:111)
at de.espirit.firstspirit.client.gui.applications.ApplicationTabRegistry$IdentifiableExecutable.execute(ApplicationTabRegistry.java:114)
at de.espirit.firstspirit.common.ScriptUtil.execute(ScriptUtil.java:106)
at de.espirit.firstspirit.common.ScriptUtil.executePrivileged(ScriptUtil.java:161)
at de.espirit.firstspirit.common.ScriptUtil.access$000(ScriptUtil.java:31)
at de.espirit.firstspirit.common.ScriptUtil$2.run(ScriptUtil.java:148)
at de.espirit.firstspirit.client.gui.util.GuiUtil$RunnableWrapper.run(GuiUtil.java:1958)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: bsh.EvalError: Typed variable declaration : Class: UserService not found in namespace : at Line: 14 : in file: inline evaluation of: ``__execute() { final String SCHEMA_NAME = "sanacorp"; final String TABLE_NAME = " . . . '' : UserService

at bsh.BSHAmbiguousName.toClass(BSHAmbiguousName.java:73)
at bsh.BSHType.getType(BSHType.java:154)
at bsh.BSHTypedVariableDeclaration.eval(BSHTypedVariableDeclaration.java:75)
at bsh.BSHBlock.evalBlock(BSHBlock.java:130)
at bsh.BSHBlock.eval(BSHBlock.java:80)
at bsh.BSHBlock.eval(BSHBlock.java:46)
at bsh.BSHIfStatement.eval(BSHIfStatement.java:48)
at bsh.BSHBlock.evalBlock(BSHBlock.java:130)
at bsh.BSHBlock.eval(BSHBlock.java:80)
at bsh.BshMethod.invokeImpl(BshMethod.java:371)
at bsh.BshMethod.invoke(BshMethod.java:267)
at bsh.BshMethod.invoke(BshMethod.java:170)
at bsh.PreparsedScript.invoke(PreparsedScript.java:66)
at de.espirit.firstspirit.server.script.BeanshellScriptEngine$BeanshellExecutable.execute(BeanshellScriptEngine.java:100)
... 9 more
Caused by: java.lang.ClassNotFoundException: Class: UserService not found in namespace
at bsh.Name.toClass(Name.java:664)
at bsh.BSHAmbiguousName.toClass(BSHAmbiguousName.java:71)
... 22 more

VG Holger

0 Kudos
felix_reinhold
Returning Responder

Re: CSV-Daten in Datenquelle importieren

Jump to solution

Hallo Holger,

der Code war nur direkt hier runtergeschrieben und somit nicht direkt lauffähig.

Z.B. fehlen die Imports. Diese müssen dem Code vorangestellt werden.

Keine Garantie auf Vollständigkeit:

import de.espirit.firstspirit.forms.FormData;

import de.espirit.firstspirit.access.UserService;

import de.espirit.firstspirit.access.store.Store;

import de.espirit.firstspirit.access.store.Store.Type;

import de.espirit.firstspirit.access.store.templatestore.Schema;

import java.io.File;

import java.io.BufferedReader;

import java.io.ByteArrayInputStream;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import javax.swing.JFileChooser;

import de.espirit.or.schema.Entity;

import de.espirit.or.Session;

Ein paar Java Grundkenntnisse sind für die Lösung leider erforderlich 😕

Beste Grüße

Felix

0 Kudos
riessh
Returning Observer

Re: CSV-Daten in Datenquelle importieren

Jump to solution

Danke Felix, es funktioniert.

Es können zwar Text-Felder und kein Datums-Felder eingelesen werden. Aber Anfang ist erst einmal gemacht.

VG Holger

0 Kudos
felix_reinhold
Returning Responder

Re: CSV-Daten in Datenquelle importieren

Jump to solution

Hallo Holger,

freut mich, dass es geht 🙂

Für Datumsfelder muss man das Ganze vorher in ein Datum umwandeln.

Das ginge bspw. so:

import java.text.SimpleDateFormat;

import java.text.ParseException;

SimpleDateFormatsdf = new SimpleDateFormat("dd.MM.yyyy"); //Durch dein Datumsformat ersetzen

und dann beim Einlesen:

try {

     ent.setValue("datum1", sdf.parse(fields[1]));

catch(ParseException e){

     // Fehler loggen. Das Datum ist nicht parseable

}

Gruß

Felix

0 Kudos
riessh
Returning Observer

Re: CSV-Daten in Datenquelle importieren

Jump to solution

Danke, das bringt mich weiter. 🙂

0 Kudos