Zahlen ersetzen
-
Hallo zusammen,
habe folgende Textdatei
DA120FN
DA130FN
TEST
DA140FNNach der Bearbeitung soll sie wie folgt aussehen:
DA400FN
DA400FN
TEST
DA400FNEs sollen alle Zahlen nach "DA" ersetzt werden. Es sind immer 3 Zahlen aber
ich weiß nicht welche. Sonst hätte ich diese replaced.Die ist der Code bis dato :
Einlesen der Datei etc. if (strstr( Zeile, "DA") && strstr( Zeile, "FN")) { if ((z=strstr( Zeile, "DA" )) != NULL ) { *z = ''; } }
Wie komme ich jetzt aber an die 3 Zahlen heran, um diese zu ersetzen ?
Danke für die Hilfe....
-
Soll es C++ sein oder hast du dich im Forum geirrt und willst nach C verschoben werden?
-
char s[] = "DA140FN"; s[2] = '4'; s[3] = '0'; s[4] = '0'; printf("%s", s);
War das das Problem?
-
sed -r -e 's/^DA[0-9]{3}(.*)/DA400\1/g'
?
-
Dobi schrieb:
sed -r -e 's/^DA[0-9]{3}(.*)/DA400\1/g'
?
-
JA das war das Problem...
Danke schön !!
-
Sorry hab zu schnell geantwortet...Die Zeile wird ja eingelesen:
1234 DM125ANF TEST
Das Problem ist ja, dass ich nicht weiß an welcher Stelle die Zahlen stehen werden, um sie zu ersetzen.
Der Vorschlag "sed" erinnert mich irgendwie an Perl. Ist bestimmt ein Tool aus einer Boost-Libary...Das führt für mein Problem aber bestimmt zu weit...
-
Sed hat nichts mit boost zu tun, sondern ist ein Kommandozeilentools, was einem erlaubt, Texte mit Hilfe von regulären Ausdrücken (PCRE, du lagst mit Perl also schon ganz gut.) zu verändern. Wenn man nur einen Hammer hat, sieht alles wie ein Nagel aus. C++ ist wunderbar und wenn du das als Programmierübung machen willst, schadet das sicher nicht. Aber wenn es Wirklich nur darum geht, das Ergebnis möglichst effizient zu bekommen, ist regex hier passend. Notepad++ kann sowas übrigens auch.
DA120FN
DA130FN
TEST
DA140FN1234 DM125ANF TEST
Wenn die Zahlen nicht immer nach "DA" sondern nach D mit irgendeinem anderen Großbuchstaben stehen, würde es so gehen:
sed -r -e 's/D([A-Z]{1})[0-9]{3}(.*)/D\1400\2/g' < in.txt
Das würde dann aus so einer in.txt
DA120FN
DA130FN
TEST
DA140FN
1234 DM125ANF TESTsowas hier machen
DA400FN
DA400FN
TEST
DA400FN
1234 DM400ANF TEST
-
@dobi danke für die ausführliche Erklärung...
Ich dachte nur es geht noch einfacher, ohne viel zu includen...
Theoretisch hätte ich gedacht --> Pointer auf DM und die folgenden 3 Zeichen (also die Zahlen) mit 400 replacen/überschreiben. Nur Praktisch weiß ich nicht wie oder ob das geht.
-
Es geht schon. Allerdings scheint es bei dir ja mal DM und mal DA zu sein. Für sowas sind reguläre Ausdrücke halt perfekt. Wenn du es aber trotzdem in C++ machen willst, gäbe es da auch regexp-Bibliotheken.
Selbermachen geht aber natürlich auch. Dann wärs aber vermutlich leichter wenn du C++-Strings benutzt und keine C-Strings, wie du es ja momentan zu machen scheinst.
Schau dir mal
http://www.cplusplus.com/reference/string/string/
an. Wenn du damit nicht klar kommst, frag ruhig nochmal nach. Dafür sind wir ja da.
-
Nein es ist immer DA...Hatte mich in einem Post verschrieben..regexp-Biblotheken wollte ich schon früher mal einbinden , bin aber gescheitert. Weiß nicht mehr woran es lag...Deswegen wollte ich das jetzt meiden...
Ja und zurzeit sind es C-Strings....Ist halt ein bestehendes Programm (net von mir), wo ich was einbauen soll...
-
Da ich fast nie etwas mit C-Strings macht, ist das bestimmt nicht die eleganteste Lösung, aber so sollte es gehen:
char Zeile[100]; strcpy_s( Zeile, "DA120FN" ); char* DAPtr( strstr( Zeile, "DA") ); char* FNPtr( strstr( Zeile, "FN") ); if ( DAPtr && FNPtr ) { int PosDA( (int) (DAPtr - Zeile) ); Zeile[PosDA+2] = '1'; Zeile[PosDA+3] = '4'; Zeile[PosDA+4] = '0'; }
-
Danke dir...Habe es ein wenig angepasst und es tut nun was es soll...
Also DANKE !