Tabelle einfügen aus .txt-datei

Das Tabellenkalkulationsprogramm

Moderator: Moderatoren

Heribert
Beiträge: 4
Registriert: Di, 14.03.2006 12:01

Tabelle einfügen aus .txt-datei

Beitrag von Heribert »

OO2.0/calc

Guten Tag!

Aufgabe:
Erzeuge aus einer .txt-Datei mit 1000 Kundenstammblättern (=Seiten) mit je 27 Positionen, bestehend aus einer Bezeichnung (z.B. "Nachname:") und Inhalt (z.B."Müller") eine Tabelle.

Mein Ansatz:
Ich habe in der .txt-Datei mittels Suchen/Ersetzen die Bezeichnungen durch ein Semikolon ersetzt. und durch "Tabelle einfügen" / "Aus Datei erstellen" in calc importiert. Im Textimport ist als Trennoption "Getrennt / Semikolon + Feldtrenner zusammenfassen" gewählt.

Problem:
Es wird keine Tabelle mit 27 Spalten erzeugt, vielmehr werden die Daten neben- und untereinander abgelegt, ähnlich wie sie in der Txtdatei auf der verteilt. So aber ist aber eine eindeutige Zuordnung von Spaltenname und Spalteninhalt nicht drin.

Was tun?

M
Lenu
*******
Beiträge: 1085
Registriert: Sa, 30.10.2004 09:24

Re: Tabelle einfügen aus .txt-datei

Beitrag von Lenu »

Heribert hat geschrieben:Ich habe in der .txt-Datei mittels Suchen/Ersetzen die Bezeichnungen durch ein Semikolon ersetzt.
Wie sieht Deine Text-Datei jetzt aus? hast Du pro Datensatz 1 Zeile (bzw. ein Absatz) und zwischen den 'Feldern' jeweils eindeutige Feldtrenner? Mit oder ohne Anführungszeichen um die Feldinhalte?
Gibt es in Deinen Kundenstammblättern auch Felder, die leer sind? Wenn ja: Wo sind die nach dem Suchen ersetzen? Hast Du auch für die leeren Felder jeweils ein Trennzeichen (sonst kann die Spaltenaufteilung sicher nicht funktionieren)?
"Getrennt / Semikolon + Feldtrenner zusammenfassen" gewählt.
Damit entfernst Du leere Felder, dann rutschen natürlich die anderen nach und die Spaltenaufteilung ist für jeden Datensatz anders. Das mit dem Zusammenfassen musst Du auf jeden Fall weglassen. Wenn Du zum Schluss ganz leere Spalten hast, die Du in der Tabelle nicht mehr haben möchtest, kannst Du die zum Schluss als ganze Spalten entfernen
vielmehr werden die Daten neben- und untereinander abgelegt, ähnlich wie sie in der Txtdatei auf der verteilt.
Das würde darauf hinweisen, dass noch in der Textdatei ein Datensatz auf mehrere Absätze verteilt ist. Ein Datensatz wird durch eine Absatzmarke beendet. Wenn Du also innerhalb eines Datensatzes RETURNS hast, werden daraus mehrere Datensätze. Das muss noch irgendwie in der Textdatei bereinigt werden bevor Du die Daten nach Calc importierst. Man kann Absatzenden schon auch mit Suchen/Ersetzen herauslöschen, aber man muss natürlich genau die richtigen herausfiltern. Kannst Du per Bedingung das Ende eines Datensatzes identifizieren?
Karolus
********
Beiträge: 7453
Registriert: Mo, 02.01.2006 19:48

Beitrag von Karolus »

Hallo Heribert
Falls die txt.- Datei ursprünglich (beispielsw.) in dieser Form vorliegt:

nachname:müller
vorname:hans
straße:bergweg
usw.
nachname:meier
vorname:karl
straße:talweg
usw.

dann würde ich in dieser Datei zuerst mit Suchen und Ersetzen:
Suche nach
straße:.*$ (hier muß der text der Bezeichnung des letzten Datenfeldes stehen)
ersetzen durch
&@€@ (oder eine andere sonst nicht vorkommende Zeichenkombination)
reguläre Ausdrücke erlauben

---alle Datensatzenden eindeutig markieren.
Danach wieder Suchen und Ersetzen
Suche
$
ersetzen
;
reguläre ausdrücke erlauben

--alle Zeilenumbrüche entfernen und durch Semikolon ersetzen

und im nächsten S. u. E.-Durchgang alle Endmarken (@€@)durch ZeilenSchaltungen
ersetzen.
suche nach
@€@
ersetzen duch
\n
reguläre ausdrücke erlauben

Das Resultat kannst du calc importieren ,und hast die Datensätze zeilenweise in 27 Spalten.
Gruß
Karo
Heribert
Beiträge: 4
Registriert: Di, 14.03.2006 12:01

Re: Tabelle einfügen aus .txt-datei

Beitrag von Heribert »

So sieht ein einzelnes Kundenstammblatt aus der txt-Datei aus.
(Die Steuerzeichen (Leerzeichen und Returns) krieg ich leider nicht dargestellt; es wird jedoch jede Zeile mit RETURN beendet)


Kundenstammblatt Datum: 06.01.06 Seite: 999


Kunden-Nr.: PR123456 Kurzname: Müller Selektion: PRIVAT



Anrede: Frau
Name1: Müller
Name2:
Name3:
Straße: Jütenstr.348
Ort: D 12345 Ortsname

Telefon geschäftl.: 1234 1234-56
Telefon privat:
Mobiltelefon:
Fax: 1234 1234-57

Ansprechpartner: Herr Müller
persönliche Anrede:
Kundengruppe: 0

Geschäftsbereich: 2 Meiner

Arbeitsbereiche: (1) 1 Seiner
(2)
(3)
(4)
(5)

Lieferbedingung: 0 Lieferbedingung nicht angelegt
Zahlungskondition: 0 000000

Umsatz lfd. Jahr
Umsatz Vorjahr 1
Umsatz Vorjahr 2

letzte Rechnung
Debitoren-Nr. 00000

Lenu hat geschrieben: Wie sieht Deine Text-Datei jetzt aus?
hast Du pro Datensatz 1 Zeile (bzw. ein Absatz) und zwischen den 'Feldern' jeweils eindeutige Feldtrenner? Mit oder ohne Anführungszeichen um die Feldinhalte?
Gibt es in Deinen Kundenstammblättern auch Felder, die leer sind? Wenn ja: Wo sind die nach dem Suchen ersetzen? Hast Du auch für die leeren Felder jeweils ein Trennzeichen (sonst kann die Spaltenaufteilung sicher nicht funktionieren)?
Nach Suchen/Ersetzen der Bezeichnungen durch ";" siehts dann so aus:


; 06.01.06 ; 999


; PR123456 ; Müller ; PRIVAT



; Frau
; Müller
;
;
; Jütenstr.348
; D 12345 Ortsname

; 1234 1234-56
;
;
; 1234 1234-57

; Herr Müller
;
; 0

; 2 Meiner

; (1) 1 Seiner
(2)
(3)
(4)
(5)

; 0 Lieferbedingung nicht angelegt
; 0 000000

;
; 1
; 2

;
; 00000


Also:
Es gibt z.T. mehrere Datensätze per Zeile/Absatz
Zwischen den Feldern je ein Semikolon.
Keine Anführungszeichen.
Es gibt leere Felder; auch diese werden durch Semikolon abgetrennt.
Zwei Datensätze (Arbeitsbereiche und Umsätze)sind über mehrere Absätze verteilt.
Lenu hat geschrieben: Kannst Du per Bedingung das Ende eines Datensatzes identifizieren?
Bedingung?
Hören Sie auf, mich zu verwirren! (Sledge Hammer)
Im Ernst: Ich hab´das OO gerade mal eine Woche installiert und wurschtele hier in den Basics rum. Hab´Gnade!

Danke

M
Lenu
*******
Beiträge: 1085
Registriert: Sa, 30.10.2004 09:24

Beitrag von Lenu »

Das sieht doch schon ganz gut aus. Lass aber den Begriff "Anrede:" noch drin (der kennzeichnet den Beginn eines neuen Datensatzes), ersetze stattdessen auch noch
(2) durch ;
(3) durch ;
(4) durch ;
(5) durch ;

Dann musst Du noch alle Zeilenschaltungen rausschmeissen:
Suchen nach: $
ersetzen durch: (leer lassen)
ankreuzen: regulärer Ausdruck (bei: mehr Optionen)

Und zum Schluss musst Du dort, wo jetzt "Anrede" steht wieder Zeilenschaltungen einfügen:
Suchen nach: Anrede:
ersetzen durch: \n
ankreuzen: regulärer Ausdruck
Lenu
*******
Beiträge: 1085
Registriert: Sa, 30.10.2004 09:24

Beitrag von Lenu »

Es könnte noch ein Problem geben:
Man kann im writer im gleichen Absatz nur eine begrenzte Anzahl Zeichen haben. Das sind zwar 65000, aber bei Deinen Kundenstammblättern könnten mehr zusammenkommen, wenn man zuerst alle Absatzenden rauslöscht.

Man muss also taktisch vorgehen und sicherstellen, dass diejenigen Absatzenden, die tatsächlich einen Datensatz beenden, drin bleiben, wenn man die anderen rauschschmeisst.

Ich teste noch.
Heribert
Beiträge: 4
Registriert: Di, 14.03.2006 12:01

Beitrag von Heribert »

Lenu hat geschrieben: Ich teste noch.
Ach Gottchen, ich dachte, das ist meine Arbeit

M
Lenu
*******
Beiträge: 1085
Registriert: Sa, 30.10.2004 09:24

Beitrag von Lenu »

Hast Du das Prinzip mit dem Entfernen der Absatzenden verstanden?
Und schonmal ausprobiert, wie weit Du kommst?
Ich habe folgendes festgestellt:
Wenn man per Suchen/Ersetzen alle Absatzenden herauslöscht und dabei längere Zeichenketten entstehen, als pro Absatz zugelassen sind, dann fügt OO nach der jeweilig zulässigen Anzahl Zeichen immer ein Absatzende ein.
Man wird also um eine Nachbearbeitung nicht herumkommen.
Hast Du schonmal ausprobiert, wie weit Du kommst mit dem Entfernen der Absatzenden?
Unter Datei/Eigenschaften/Statistik kannst Du nachschauen, wieviele Zeichen das Dokument hast. Wieviel sind denn das bei Dir?
Lenu
*******
Beiträge: 1085
Registriert: Sa, 30.10.2004 09:24

Beitrag von Lenu »

OK, so müsste es gehen:

Erster Schritt:
Du machst das, was Du zuerst getan hast (Suchen/Ersetzen der Bezeichner) nochmal neu und lässt dabei den Bezeichner Anrede: stehen, damit wir später noch wissen, wo ein neuer Datensatz beginnt. Dann fügst Du bei den 'Arbeitsbereichen' auch noch Semikolons ein, also Suchen nach: (2) ersetzen durch:; etc.

Zweiter Schritt:
Mit Suchen/Ersetzen werden zunächst alle Absatzenden rausgelöscht:
Suchen nach: $
ersetzen durch: (leer lassen)
ankreuzen: regulärer Ausdruck (bei: mehr Optionen)

Dritter Schritt:
Theoretisch müsste jetzt nur noch ein einziger Absatz vorhanden sein. Praktisch wird es aber so sein, dass Du mehr Zeichen hast, als für einen einzelnen Absatz zulässig sind und daher wirst Du nun an einigen willkürlichen Stellen Absatzenden haben. Damit die den Datensatzaufbau nicht durcheinanderbringen, musst Du nun mit zwei zusätzlichen Hilfsdokumenten arbeiten.

Zunächst suchst Du den ersten Absatz, wieder mit
suchen nach: $
und ankreuzen: regulärer Ausdruck.
Wenn der gefunden ist, markierst Du alles, was davor liegt, schneidest es aus und fügst es in das erste Hilfsdokument ein. Das wird dann nachher Deine neue Datenquelle. In diesem Zieldokument ersetzt Du nun überall den Bezeichner "Anrede:" durch ein Absatzende:
Suchen nach: Anrede:
ersetzen durch: \n
ankreuzen: regulärer Ausdruck

Vierter Schritt:
Im Ausgangsdokument suchst Du das nächste Absatzende, schneidest alles davor liegende aus und fügst es in das zweite Hilfsdokument. Hier wieder per suchen/ersetzen "Anrede:" durch ein Absatzende ersetzen. Dann alles in diesem "Zwischendokument" markieren, ausschneiden und am Schluss des "Zieldokumentes" anfügen. Darauf achten, dass Du das direkt anfügst, ohne Absatzende zwischen dem ersten und zweiten Teil, denn das wird kaum ein Datensatzende sein.

Den vierten Schritt wiederholst Du so oft, bis das Ausgangsdokument leer ist.

Vorletzter Schritt:
Aus einem "Musterdatensatz" erstellst Du die Spaltentitel, indem Du die Bezeichner stehen lässt und jeweils den Doppelpunkt und anschliessenden Feldinhalt rauslöschst (daran denken, dass Du 5 'Arbeitsbereiche' hast). Zwischen den Bezeichnern müssen auch Semikolons stehen. Diese Spaltentitel fügst Du als ersten Absatz in das Zieldokument ein.

Letzter Schritt:
Du müsstest jetzt ein Dokument haben, in dem jeder Datensatz in einem eigenen Absatz steht und zwischen allen Datenfeldern befindet sich jeweils ein Semikolon. So kannst Du diese Datei jetzt in Calc importieren.
Heribert
Beiträge: 4
Registriert: Di, 14.03.2006 12:01

Beitrag von Heribert »

Erster Schritt
done
Zweiter Schritt
dito
Auffallen tut mir, daß bei diesem Schritt nur die Hälfte der Absatzenden rausgefiltert werden; erst in einem zweiten Durchgang ist dann alles weg.
(Wieso kann ich eigentlich nach dem Steuerzeichen "$" suchen, das ich trotz eingeschalteter Steuerzeichen gar nicht sehe?)
Dritter Schritt:
Theoretisch ...
Praktisch auch: Wenn ich dies jetzt in eine Tabelle rüberhole, siehts schon recht brauchbar aus.
Aber:
Zunächst suchst Du den ersten Absatz, wieder mit
suchen nach: $
und ankreuzen: regulärer Ausdruck.
Wenn der gefunden ist, ...
Nein, jetzt gibts die Meldung "Suchbegriff nicht gefunden", obwohl "regulärer Ausdruck" an ist.

hm, hm

M
Lenu
*******
Beiträge: 1085
Registriert: Sa, 30.10.2004 09:24

Beitrag von Lenu »

Heribert hat geschrieben:
Zunächst suchst Du den ersten Absatz, wieder mit
suchen nach: $
und ankreuzen: regulärer Ausdruck.
Wenn der gefunden ist, ...
Nein, jetzt gibts die Meldung "Suchbegriff nicht gefunden", obwohl "regulärer Ausdruck" an ist.
Ich würde sagen: umso besser. Dann hat Deine ganze Datei in einem einzigen Absatz Platz. Das heisst, Du kannst Dir den Umweg über die Hilfsdateien sparen und ersetzt direkt hier "Anrede:" durch \n (reg.Ausdr.)
Gumminase
**
Beiträge: 32
Registriert: Sa, 18.02.2006 22:24

Primitivlösung

Beitrag von Gumminase »

Hi, habe öfter ähnliches Problem.
Allerdings mit weniger Datensätzen( 30-100).

Lösung:
Der untereinanderstehende Datensatz wird nach rechts in einzelne Spalten aufgelöst.
Das geht ganz einfach mittels =(Spalte,Zeile)
d.h. den Namen in die Namen-Spalte
Vorname in Vornamen-Spalte, usw.
Es muß nur alles in einer Zeile liegen.
Diese Verknüpfungszeile per drag & drop
bei allen Datensätzen anwenden.
Dann ist schon fast fertig.
Nachteil: löscht man die linke Gesamtspalte,
so steht eine 0 in allen Zellen.
Also als CSV abspeichern und wieder einlesen,
dann linke Spalte löschen, alles als Bereich festlegen
und sortieren.
Fertig.

Jaja, ich weiß. Ist primitiv. Geht aber sehr schnell und problemlos.
Nur dieser drag & drop Sch... ist nervig.
Vorteil: wenn die Liste sehr holperig vorliegt, d.h. unterschiedlich viele Leerzeilen zwischen den Datensätzen oder sonstwie unterschiedlich ist. Dann muß nicht vorher alles korregiert werden.
Karolus
********
Beiträge: 7453
Registriert: Mo, 02.01.2006 19:48

Beitrag von Karolus »

Hallo

@Gumminase

Deine Lösung ist gar nicht so primitiv, lässt sich formelmässig aber noch etwas ausbauen, so das nicht jeder Datensatz per Drag und Drop transponiert werden muss.

Sofern alle Datensätze die gleiche Anzahl von Datenfeldern haben , die Datenfelder innerhalb der Datensätze in der gleichen Reihenfolge vorliegen und alles in einer Spalte ist,
gehts mit folgender Formel (in der Zelle links oben im Zielbereich) :

=INDIREKT("A"&ZEILE(A1)*x-x+SPALTE(A1)

x steht für die Anzahl der Datenfelder

Diese Formel dann x Spalten nach rechts ziehen, und dann die ganze Zeile nach unten ziehen über y Zeilen (y ist Anzahl der Datensätze).

Gruß
Karo
Antworten