Konvertierung Dezimaltrennzeichen . zu ,
Konvertierung Dezimaltrennzeichen . zu ,
Hallo,
brauch ein paar Ideen:
Folgendes Problem
Aus einer Software werden Daten in eine Exportdatei (*.txt) geschrieben.
Die Größe der Datei (Anzahl der Datensätze) kann variieren.
Jede Zeile ist folgendermassen aufgebaut:
Jedes Feld ist durch eine Semikolon getrennt.
Das erste Feld ist eine Textfeld mit 50 Zeichen
Ab Spalte 51 kommen Zahlenwerte, wobei das Dezimaltrennzeichen ein Punkt ist.
Wie kann ich ab Spalte 51 den Punkt durch ein Komma ersetzen.
Wichtig ist der Offset 51, da im 1 Feld (Textfeld) auch einen Punkt im String enthalten sein darf.
Ich habe eine Script von Autor NicTheQuick (updated for PB3.92+ by Lars)
"Files Read&Write blockwise"
gefunden, indem die Characters 32,13,10 gelöscht werden.
Wie ist es Möglich ein Charakter zu ersetzen.
Danke für eure Ideen
brauch ein paar Ideen:
Folgendes Problem
Aus einer Software werden Daten in eine Exportdatei (*.txt) geschrieben.
Die Größe der Datei (Anzahl der Datensätze) kann variieren.
Jede Zeile ist folgendermassen aufgebaut:
Jedes Feld ist durch eine Semikolon getrennt.
Das erste Feld ist eine Textfeld mit 50 Zeichen
Ab Spalte 51 kommen Zahlenwerte, wobei das Dezimaltrennzeichen ein Punkt ist.
Wie kann ich ab Spalte 51 den Punkt durch ein Komma ersetzen.
Wichtig ist der Offset 51, da im 1 Feld (Textfeld) auch einen Punkt im String enthalten sein darf.
Ich habe eine Script von Autor NicTheQuick (updated for PB3.92+ by Lars)
"Files Read&Write blockwise"
gefunden, indem die Characters 32,13,10 gelöscht werden.
Wie ist es Möglich ein Charakter zu ersetzen.
Danke für eure Ideen
Re: Konvertierung Dezimaltrennzeichen . zu ,
> Danke für eure Ideen
mit welcher PB-Version programmierste denn? Die Gelegenheit ist passend,
um diese Angabe in Deine Signatur zu schreiben.
Grüße ... Kiffi
mit welcher PB-Version programmierste denn? Die Gelegenheit ist passend,
um diese Angabe in Deine Signatur zu schreiben.
Grüße ... Kiffi
a²+b²=mc²
> ab sofort mit PB 4
OK, wie geschrieben: Wenn Du das in Deine Signatur hineinschreibst, dann
gibt's in Zukunft keine lästigen Rückfragen mehr
Zu Deinem Problem:
Der Gedankenansatz ist folgender: Du hast die zu konvertierende CSV-Datei
(Source) und liest diese Zeile für Zeile aus. Jede ausgelesene Zeile kannst
Du bei Bedarf bearbeiten und danach in eine andere (neu erstellte)
CSV-Datei (Target) schreiben.
Der Code (ungetestet):
Grüße ... Kiffi
OK, wie geschrieben: Wenn Du das in Deine Signatur hineinschreibst, dann
gibt's in Zukunft keine lästigen Rückfragen mehr

Zu Deinem Problem:
Der Gedankenansatz ist folgender: Du hast die zu konvertierende CSV-Datei
(Source) und liest diese Zeile für Zeile aus. Jede ausgelesene Zeile kannst
Du bei Bedarf bearbeiten und danach in eine andere (neu erstellte)
CSV-Datei (Target) schreiben.
Der Code (ungetestet):
Code: Alles auswählen
Source = ReadFile(#PB_Any, [Source.Csv])
If Source
Target = CreateFile(#PB_Any, [Target.Csv])
If Target
While Eof(Source)=0
Zeile$ = ReadString(Source)
For FeldZaehler = 1 To CountString(Zeile$, ";") + 1
If FeldZaehler > 50 ; Ab einer gewissen Feldanzahl...
; ... Punkt durch Komma ersetzen
NeueZeile$ + ReplaceString(StringField(Zeile$, FeldZaehler, ";") , ".", ",")
Else
NeueZeile$ + StringField(Zeile$, FeldZaehler, ";")
EndIf
If FeldZaehler < CountString(Zeile$, ";") + 1
NeueZeile$ + ";"
EndIf
Next
WriteStringN(Target, NeueZeile$)
Wend
CloseFile(Target)
Else
; Target.Csv konnte nicht erstellt werden
EndIf
CloseFile(Source)
Else
; Source.Csv konnte nicht gelesen werden
EndIf
a²+b²=mc²
theoretisch ja. Aber die Anforderung von HoDam ist ja, dass erst ab dem 51Karl hat geschrieben:Geht doch bestimmt schneller?
Feld einer jeden Zeile ersetzt werden soll.
prima. Den Code flexibel zu halten ist sowieso besser.HoDam hat geschrieben:Habe s noch ein bisschen angepasst, das es universeller einsetzbar ist.
Grüße ... Kiffi
a²+b²=mc²
merkwürdiges Verhalten.
auf meinem Rechner in der Firma funktioniert es.
test1;8,5;6,3
test2;4,3;8,2
test3;5,4;3,2
Auf meinem Homerechner nicht. er schenit den Befehl WriteStringN falsch zu verstehen und schreibt keine Return.
sieht dann so aus
test1;8,5;6,3
test1;8,5;6,3test2;4,3;8,2
test1;8,5;6,3test2;4,3;8,2test3;5.4;3,2
Unterschied zwischen Firma und Homerechner
Firma WinXP-Prof; PB3.94 und PB4 ; jabpe 2.x
Home Win2k; PB4; japbe 3.6.7.548
2Punkt: Diese Lösung ersetzt den Punkt durch Komma nach dem ersten Semikolon.
Ich möchte es noch Flexibler haben, da es durchaus vorkommen kann, das im ersten Feld (String) ein Semikolon vorkommen kann.
wie muss ich das Gestalten das ich ab einer bestimmten Anzahl von Charakters (inklusive Leerzeichen) erst mit dem ersetzen beginnt.
Hintergrund: Diese Daten sollen in eine *.csv Datei geschrieben werden. Das erste Feld ist ein Messbezeichnung. Da csv-Dateien direkt von Excel aufgerufen werden können wäre es sogar Sinnvoll das erste Feld in Anführungszeichen zu setzen.Es handelt sich hierbei um eine feste Stringgröße z.B 50 Zeichen auch Leerezeichen. Danach folgt ein Semikolon (Offset51) und ab da kommen nur noch Zahlen wo der Punkt durch ein Komma erstzt werden soll.
Den Offest liest das Programm aus einem INI-File.
Danke
auf meinem Rechner in der Firma funktioniert es.
test1;8,5;6,3
test2;4,3;8,2
test3;5,4;3,2
Auf meinem Homerechner nicht. er schenit den Befehl WriteStringN falsch zu verstehen und schreibt keine Return.
sieht dann so aus
test1;8,5;6,3
test1;8,5;6,3test2;4,3;8,2
test1;8,5;6,3test2;4,3;8,2test3;5.4;3,2
Unterschied zwischen Firma und Homerechner
Firma WinXP-Prof; PB3.94 und PB4 ; jabpe 2.x
Home Win2k; PB4; japbe 3.6.7.548
2Punkt: Diese Lösung ersetzt den Punkt durch Komma nach dem ersten Semikolon.
Ich möchte es noch Flexibler haben, da es durchaus vorkommen kann, das im ersten Feld (String) ein Semikolon vorkommen kann.
wie muss ich das Gestalten das ich ab einer bestimmten Anzahl von Charakters (inklusive Leerzeichen) erst mit dem ersetzen beginnt.
Hintergrund: Diese Daten sollen in eine *.csv Datei geschrieben werden. Das erste Feld ist ein Messbezeichnung. Da csv-Dateien direkt von Excel aufgerufen werden können wäre es sogar Sinnvoll das erste Feld in Anführungszeichen zu setzen.Es handelt sich hierbei um eine feste Stringgröße z.B 50 Zeichen auch Leerezeichen. Danach folgt ein Semikolon (Offset51) und ab da kommen nur noch Zahlen wo der Punkt durch ein Komma erstzt werden soll.
Den Offest liest das Programm aus einem INI-File.
Danke
PB 4 Final
> Auf meinem Homerechner nicht. er schenit den Befehl WriteStringN
> falsch zu verstehen und schreibt keine Return.
nee, ist'n Fehler in meinem Code. Schreib mal nach
ein
> Ich möchte es noch Flexibler haben, da es durchaus vorkommen kann,
> das im ersten Feld (String) ein Semikolon vorkommen kann.
in einem Feld kommt nur dann ein Feldtrenner vor, wenn es mit Textbegrenzern eingefasst worden ist.
Wenn das bei Dir der Fall ist, dann musst Du bei der Aufteilung der Felder
anders vorgehen. Code kann ich Dir heute keinen mehr liefern. Dafür ist
es einfach zu heiss.
Grüße ... Kiffi
// Edit:
Die While-Wend-Schleife ersetzt Du durch folgenden Code:
CharOffset musst Du dann vorher irgendwo auf 50 setzen.
> falsch zu verstehen und schreibt keine Return.
nee, ist'n Fehler in meinem Code. Schreib mal nach
Code: Alles auswählen
WriteStringN(Target, NeueZeile$)
Code: Alles auswählen
NeueZeile$ = ""
> das im ersten Feld (String) ein Semikolon vorkommen kann.
in einem Feld kommt nur dann ein Feldtrenner vor, wenn es mit Textbegrenzern eingefasst worden ist.
Wenn das bei Dir der Fall ist, dann musst Du bei der Aufteilung der Felder
anders vorgehen. Code kann ich Dir heute keinen mehr liefern. Dafür ist
es einfach zu heiss.
Grüße ... Kiffi
// Edit:
Die While-Wend-Schleife ersetzt Du durch folgenden Code:
Code: Alles auswählen
While Eof(Source)=0
Zeile$ = ReadString(Source)
Zeile$ = Left(Zeile$, CharOffset) + ReplaceString(Mid(Zeile$,CharOffset+1,Len(Zeile$)-CharOffset), ".", ",")
WriteStringN(Target, Zeile$)
Wend
a²+b²=mc²