Seite 1 von 2

Konvertierung Dezimaltrennzeichen . zu ,

Verfasst: 25.07.2006 11:46
von HoDam
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

Re: Konvertierung Dezimaltrennzeichen . zu ,

Verfasst: 25.07.2006 11:51
von Kiffi
> 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

Verfasst: 25.07.2006 12:01
von HoDam
ab sofort mit PB 4

Grüße

HoDam

Verfasst: 25.07.2006 12:34
von bobobo
Zeichen ersetzt Du mit ReplaceString()

Verfasst: 25.07.2006 12:47
von Kiffi
> 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):

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
Grüße ... Kiffi

Verfasst: 25.07.2006 13:57
von Karl
Mal ´ne Rückfrage an Kiffi:

kann man die komplette Datei in den Speicher laden, ReplaceString() anwenden und das Ergebnis in eine Datei zurückschreiben? Geht doch bestimmt schneller?

Gruß Karl

Verfasst: 25.07.2006 13:57
von HoDam
Danke Kiffi,

das hat mir weiter geholfen. :)

Habe s noch ein bisschen angepasst, das es universeller einsetzbar ist.

Indem ich aus einem INI-File den

Offset
Character
Ort+Lesedatei
Speicherort+Zieldatei


Dankeschön und Grüße

HoDam

Verfasst: 25.07.2006 14:16
von Kiffi
Karl hat geschrieben:Geht doch bestimmt schneller?
theoretisch ja. Aber die Anforderung von HoDam ist ja, dass erst ab dem 51
Feld einer jeden Zeile ersetzt werden soll.
HoDam hat geschrieben:Habe s noch ein bisschen angepasst, das es universeller einsetzbar ist.
prima. Den Code flexibel zu halten ist sowieso besser.

Grüße ... Kiffi

Verfasst: 25.07.2006 20:40
von HoDam
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

Verfasst: 25.07.2006 23:04
von Kiffi
> 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

Code: Alles auswählen

WriteStringN(Target, NeueZeile$)
ein

Code: Alles auswählen

NeueZeile$ = ""
> 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:

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
CharOffset musst Du dann vorher irgendwo auf 50 setzen.