Frage zu calc

Hallo!

Ich habe eine Datei die folgendermassen wiederholend aufgebaut ist:
Label Trennzeichen Wert

Label stellt eine Bezeichnung in Folge einer Zahl (0-99) dar
Trennzeichen ist immer das Gleichheitszeichen (=)
Wert stellt immer ein Interger dar (zB 123.4567)
Aus mehreren Labeln stellen sich Gruppen zusammen.

Wie kann ich diese Datei nach calc importieren?
Folgende Schritte wären nötig:
- Label in einen Text umwandeln
- den Punkt im Wert in ein Komma umwandeln
- nur vollständige Gruppen erkennen und nur diese verarbeiten

Beispiel einer Gruppe:
5=100
4=61
6=2.1
37=100.0000
38=200.0000
39=20.000

gewünschtes Format (tabellarisch):
100 61 200,000 100,000 20,00

Für Lösungen wäre ich dankbar.

Mohing, VT schrieb:

Ich habe eine Datei

Welches Format hat die Datei denn? Reines Textformat? Dann würde sich die Bearbeitung mit einem normalen Editor anbieten, bevor du das Ganze als csv-Datei nach Calc bringst.

ein Interger dar (zB 123.4567)

Falls das die Zahl 123,4567 sein soll (also hundertdreiundzwanzig Komma 4567), so ist das kein Integer (Ganzzahl), sondern eine Dezimalzahl.

Aus mehreren Labeln stellen sich Gruppen zusammen.

Dies habe ich nicht verstanden. Was ist eine Gruppe, woran erkennt man die? Werden zwei Gruppen durch Leerzeile getrennt oder wie? Auch die Zahlen im Beispiel kann ich nicht sinnvoll vom Ursprungsformat zum Zielformat zuordnen.

Vermutlich hast du noch keine hilfreiche Rückmeldung erhalten, weil das nicht klar genug formuliert war. Vielleicht beschreibst du einfach nochmal neu?

Micha

Mohing, VT schrieb:

Ich habe eine Datei

Welches Format hat die Datei denn? Reines Textformat? Dann würde sich die Bearbeitung mit einem normalen Editor anbieten, bevor du das Ganze als csv-Datei nach Calc bringst.

Dateiformat: ASCII, also reines Textformat
Editor scheidet aus, da pro Arbeitstag etwa 6000 Zeilen Daten zusammen kommen können.

ein Interger dar (zB 123.4567)

Falls das die Zahl 123,4567 sein soll (also hundertdreiundzwanzig Komma 4567), so ist das kein Integer (Ganzzahl), sondern eine Dezimalzahl.

Stimmt- lange her das ich Programmiert habe.

Aus mehreren Labeln stellen sich Gruppen zusammen.

Dies habe ich nicht verstanden. Was ist eine Gruppe, woran erkennt man die? Werden zwei Gruppen durch Leerzeile getrennt oder wie? Auch die Zahlen im Beispiel kann ich nicht sinnvoll vom Ursprungsformat zum Zielformat zuordnen.

Man erkennt einer Gruppe einzig und allein durch eine wiederkehrende Labelabfolge. Keine Leerzeilen. Einzig und allein eine Stack-Struktur.

Vermutlich hast du noch keine hilfreiche Rückmeldung erhalten, weil das nicht klar genug formuliert war. Vielleicht beschreibst du einfach nochmal neu?

Eingabedatei (Ausschnitt, 2 Blöcke):
5=1
4=2.1
6=61
37=100.0000
38=200.0000
39=20.00
5=121
4=3.2
6=51
37=112.2345
38=212.7654
39.19.99

Ausgabedatei:
a) Tabellarisch mit Leerzeichen als Trenner und/oder
b) in Formularstruktur mit Textbezeichnungen; zB als Nachweis

Vor 25 Jahren habe ich das mal in Pascal programmiert- aber das hilft mir heute nicht weiter.
Wollte nur wissen ob sich dieses Problemchen mit LO erschlagen ließe. Sonst muss ich in den sauren Apfel "Perl" beißen.

Grüsse Guido

Hallo,

Mohing, VT schrieb:

Hallo!

Ich habe eine Datei die folgendermassen wiederholend aufgebaut ist:
Label Trennzeichen Wert

Label stellt eine Bezeichnung in Folge einer Zahl (0-99) dar
Trennzeichen ist immer das Gleichheitszeichen (=)
Wert stellt immer ein Interger dar (zB 123.4567)
Aus mehreren Labeln stellen sich Gruppen zusammen.

Wie kann ich diese Datei nach calc importieren?
Folgende Schritte wären nötig:
- Label in einen Text umwandeln
- den Punkt im Wert in ein Komma umwandeln
- nur vollständige Gruppen erkennen und nur diese verarbeiten

Beispiel einer Gruppe:
5=100
4=61
6=2.1
37=100.0000
38=200.0000
39=20.000

gewünschtes Format (tabellarisch):
100 61 200,000 100,000 20,00

Für Lösungen wäre ich dankbar.

Ich würde in zwei Schritten vorgehen, zuerst die Daten importieren und dann die Gruppen analysieren.

Zum Importieren benutzt du den üblichen CSV-Import Dialog. Dort kannst du angeben, dass das Zeichen = das Trennzeichen sein soll. Es wird dann gar nicht erst nach Calc übernommen, sondern sorgt nur dafür, dass Label und Zahl in getrennten Spalten landen.

In der Vorschau klickst du beim Label auf den Spaltenkopf. Dann ist darüber die Typ-Auswahlliste aktiv und dort stellst du als Typ "Text" ein. Ähnlich für die Zahl, dort wählst du als Typ "US Englisch". Dadurch wird der Punkt als Dezimaltrenner erkannt und beim Import werden die Zahlen dann automatisch in die deutsche Schreibweise mit Komma umgewandelt.

Für "Gruppen analysieren" müsstest du zunächst erklären, woran man eine Gruppe erkennt.

Mit freundlichen Grüßen
Regina

Dies habe ich nicht verstanden. Was ist eine Gruppe, woran erkennt man
die? Werden zwei Gruppen durch Leerzeile getrennt oder wie? Auch die
Zahlen im Beispiel kann ich nicht sinnvoll vom Ursprungsformat zum
Zielformat zuordnen.

Man erkennt einer Gruppe einzig und allein durch eine wiederkehrende
Labelabfolge. Keine Leerzeilen. Einzig und allein eine Stack-Struktur.

Sind die Gruppen alle vollständig, oder können da u. U. auch Labels fehlen?

Vermutlich hast du noch keine hilfreiche Rückmeldung erhalten, weil
das nicht klar genug formuliert war. Vielleicht beschreibst du einfach
nochmal neu?

Eingabedatei (Ausschnitt, 2 Blöcke):
5=1
4=2.1
6=61
37=100.0000
38=200.0000
39=20.00
5=121
4=3.2
6=51
37=112.2345
38=212.7654
39.19.99

Möglichkeit 1: Alles einlesen in ein separates Tabellenblatt (mit dem
'=' als Trenner), und dann per Makro die Gruppe zusammenfassen und
Zeilenweise in ein weiteres Tabellenblatt einfügen. Diese Variante
ermöglicht ach das Zusammenfassen unvollständiger Gruppen. Ungefähr so
(grob zusammen geschuster, ungeprüft):

Dim oSourceSheet As Object
Dim oTargetSheet As Object
Dim oCellAddress As Object
Dim oCell As Object
DIM iSourcetline as interger
DIM iTargetline as integer
Dim v As Variant
Dim sGruppe as string

oSourceSheet = ThisComponent.Sheets(SourceSheet)
oTargetSheet = ThisComponent.Sheets(TargetSheet)

iSourcetline = 1
iTargetline = 0
sGruppe = ""

oCell = oSourceSheet.getCellByPosition(1,iSourcetline)
v = oCell.String
DO UNTIL v = ""
  IF v = 5
    IF iTargetline > 0
      oCell = oTargetSheet.getCellByPosition(1,iTargetline)
      oCell.String = Trim(sGruppe)
    END IF
    iTargetline = iTargetline + 1
    sGruppe = ""
  END IF
  oCell = oSourceSheet.getCellByPosition(2,iSourcetline)
  v = oCell.String
  sGruppe = sGruppe & " " & oCell.String
  iSourcetline = iSourcetline + 1
  oCell = oSourceSheet.getCellByPosition(1,iSourcetline)
  v = oCell.String
LOOP

Variante zu Möglichkeit 1: Alternativ kann man die Datei auch direkt im
Makro öffnen und Zeilenweise einlesen. Allerdings hat man dann keine
(oder keine so gute) Möglichkeit, die eingelesenen Daten ggf. mit den
ausgegebenen Daten zu vergleichen.

Möglichkeit 2: Alles einlesen in ein separates Tabellenblatt (siehe
Möglilchkeit 1) und per Formel zusammenfassen. Diese Variante setzt
allerdings voraus, daß alle Gruppen vollständig sind. Ungefähr so (auch
nur grob zusammen geschustert):

=INDIREKT(ADRESSE(((ZEILE()-1)*6)+1;2;4;2;"Tabelle1")) & " " & _
INDIREKT(ADRESSE(((ZEILE()-1)*6)+2;2;4;2;"Tabelle1")) & " " & _
INDIREKT(ADRESSE(((ZEILE()-1)*6)+3;2;4;2;"Tabelle1")) & " " & _
INDIREKT(ADRESSE(((ZEILE()-1)*6)+4;2;4;2;"Tabelle1")) & ...

Wenn die Gruppen auch teilweise unvollständig sein können sollten, dann
müsstest Du das ganze aufwendiger gestalten. Ich würde dann mehrere
Spalten erstellen und über SVERWEIS arbeiten:

Spalte A
=ADRESSE(((ZEILE()-1)*6)+1;1;4;2;"Tabelle1") & ":" &
ADRESSE(((ZEILE()-1)*6)+6;2;4;2)

Spalte B:
=SVERWEIS(5;INDIREKT($A1);2;0)

Spalte C:
=SVERWEIS(4;INDIREKT($A1);2;0)

Spalte D:
=SVERWEIS(6;INDIREKT($A1);2;0)

Spalte E:
=SVERWEIS(37;INDIREKT($A1);2;0)

usw.

Ausgabedatei:
a) Tabellarisch mit Leerzeichen als Trenner und/oder
b) in Formularstruktur mit Textbezeichnungen; zB als Nachweis

Letzteres verstehe ich nicht; meinst Du, als zeilenweisen Datensatz mit
den einzelnen Werten in je einer Zelle? Im Prinzip macht das (fast) die
obige Formel (wenn Du die einzelnen 'INDIREKT(...)'-Teile anstatt
miteinander zu verknüpfen eben in separate Spalten schreibst).

Vor 25 Jahren habe ich das mal in Pascal programmiert- aber das hilft
mir heute nicht weiter.

Ich hätte ehrlich gesagt damals schon die Daten zu zeilenweisen
Datensätzen zusammengefasst; aber auch das hilft Dir heute nicht weiter. :-/

Wollte nur wissen ob sich dieses Problemchen mit LO erschlagen ließe.

Erschlagen lässt sich fast alles. Die Frage ist höchstens, wie und mit
welchem Aufwand; bzw. wie komfortabel, und welche Ausnahme- oder
Fehlersituationen ggf. abgefangen werden sollen.

Wolfgang