melmacker
Goto Top

Wie kann man Werte aus einer Text-Datei in eine zweite Text-Datei übertragen?

Hallo und gleichzeitig auch danke erstmal an alle die sich meiner Frage widmen.

Ich habe eine erste Text-Datei wo Zeile für Zeile als erstes ein Wort dann ein Leerzeichen und dann entweder wieder ein Wort oder eine Zahl ist.
So sieht das in der ersten Text-Datei aus(Ist nur ein Schnipsel):

3DCOMPAREMODE 3
3DOSMODE 11
ACADLSPASDOC 0
ACISOUTVER 70
AFLAGS 0
ANGBASE 0
ANGDIR 0
ANNOALLVISIBLE 1
ANNOAUTOSCALE -4
ANNOTATIVEDWG 0
APBOX 0
APERTURE 10
AREAPREC -1
AREAUNITS Inftmiµmmmcmmkm
ARRAYASSOCIATIVITY 1
ARRAYTYPE 0
ATTDIA 0
ATTMODE 1
ATTREQ 1
AUDITCTL 0
AUNITS 0
AUPREC 0
AUTOCOMPLETEDELAY 0
AUTOCOMPLETEMODE 37
AUTOMENULOAD 1
AUTORESETSCALES 0
AUTOSNAP 119
AUTOVPFITTING 1
AXISMODE 0
BACKGROUNDPLOT 2
BACTIONCOLOR 7

(Zur Info in der ersten Text-Datei sind es 814 Zeilen)

Nun habe ich eine zweite Text-Datei wo halt NAME und NAME1 und WERT und WERT1 an den Stellen steht wo das jeweils eingefügt werden soll.
So sieht die zweite Text-Datei aus(sie führt sich so fort):

(setq a (getvar "NAME"))  
(if (= a WERT)
then (princ "\nBei NAME1 ist ein Fehler aufgetreten."))  
(if (= a WERT1)
then (setq Fail 1))

(setq a (getvar "NAME"))  
(if (= a WERT)
then (princ "\nBei NAME1 ist ein Fehler aufgetreten."))  
(if (= a WERT1)
then (setq Fail 1))

(setq a (getvar "NAME"))  
(if (= a WERT)
then (princ "\nBei NAME1 ist ein Fehler aufgetreten."))  
(if (= a WERT1)
then (setq Fail 1))

(Und in der Zweiten Text-Datei sind es 4883 Zeilen)
(Nicht wundern ist eine andere Programmiersprache (LISP) die für CAD Programme benutzt wird)

Bei NAME und NAME1 soll das Wort was am Anfang steht eingefügt werden.
Bei WERT und WERT1 soll das eingefügt werden was hinter dem Leerzeichen steht.
Die Sache ist das jedes Wort (das was am Anfang jeder Zeile steht) nur ein mal für NAME und NAME1 eingesetzt werden darf und für den nächsten Abschnitt wird dann das Wort aus der nächsten Zeile ein mal in NAME und NAME1 eingesetzt und immer so weiter.
Das selbe soll auch so mit den Werten passieren also soll jeder Wert (das was hinter dem Leerzeichen steht) nur ein mal für NAME und NAME1 eingesetzt werden und für den nächsten Abschnitt soll dann der Wert aus der nächsten Zeile eingesetzt werden.
Es müssen am Ende 814 solcher Abschnitte mit den jeweiligen Werten aus der ersten Text-Datei in der zweiten Text-Datei sein.

Das bezeichne ich als ein Abschnitt:

(setq a (getvar "NAME"))  
(if (= a WERT)
then (princ "\nBei NAME1 ist ein Fehler aufgetreten."))  
(if (= a WERT1)
then (setq Fail 1))

Ich bedanke mich im voraus für jede Mithilfe.

Mfg

Melmacker

Content-Key: 391935

Url: https://administrator.de/contentid/391935

Printed on: April 19, 2024 at 22:04 o'clock

Member: Spirit-of-Eli
Spirit-of-Eli Nov 07, 2018 at 15:07:25 (UTC)
Goto Top
Moin,

die Frage ist eher was du für Optionen hast.
Ich wurde das ganze simpel über Excel lösen.

Kommt das Thema häufiger oder nur ein mal vor?

Gruß
Spirit
Member: Melmacker
Melmacker Nov 07, 2018 at 15:12:53 (UTC)
Goto Top
Excel habe ich nicht geht das auch mit Google Tabellen?
Ich muss das nur ein mal machen.

Mfg

Melmacker
Mitglied: 137443
137443 Nov 07, 2018 at 15:40:43 (UTC)
Goto Top
Mit n' bisschen Powershell wäre das kein großes Problem.

Gruß l.
Member: Melmacker
Melmacker Nov 07, 2018 updated at 15:58:10 (UTC)
Goto Top
Könntest du mir dafür einen Code schreiben den ich nur noch in Powershell einfügen muss?

Mfg

Melmacker
Mitglied: 137443
Solution 137443 Nov 07, 2018 updated at 17:47:29 (UTC)
Goto Top
Klar, ...
$reference = gc "c:\data1.txt"  
$code = gc "c:\data2.txt" -raw  
$cnt = 0
$code -split '(?sm)^\s*$' | %{  
    $block = $_
   if ($cnt -lt $reference.count){
@('NAME1','NAME')  | %{$block = $block.replace($_,$reference[$cnt].split(' '))}  
    @('WERT1','WERT')  | %{$block = $block.replace($_,$reference[$cnt].split(' ')[1])}  
   }
   $block
   $cnt++
} | sc 'c:\data2.txt'  
Member: Pedant
Solution Pedant Nov 07, 2018 at 17:23:24 (UTC)
Goto Top
Hallo Melmacker,

Zitat von @Melmacker:
Könntest du mir dafür einen Code schreiben den ich nur noch in Powershell einfügen muss?
die Frage klingt nach: "Könntest Du meine Arbeit machen, weil ich heute keinen Bock habe."

Ich unterstelle mal Du hast gefragt, weil Du keine Ahnung hast wie's geht.
Ich auch nicht, aber wenn's auch batch sein darf:

@echo off
REM *** Hier die Dateinamen hinter dem = anpassen ***
set eingabedatei=eingabedateiname.txt
set ausgabedatei=ausgabedateiname.txt

chcp 1252
if exist %ausgabedatei% del %ausgabedatei%
echo Lese %eingabedatei% und schreibe %ausgabedatei%...

setlocal EnableDelayedExpansion 
for /f "tokens=1,2" %%a in ('type %eingabedatei%') do (  
	set name=%%a
	set wert=%%b
	echo ^(setq a ^(getvar "!name!"^)^)>>%ausgabedatei%  
	echo ^(if ^(= a !wert!^)>>%ausgabedatei%
	echo then ^(princ "\nBei !name! ist ein Fehler aufgetreten."^)^)>>%ausgabedatei%  
	echo ^(if ^(= a !wert!^)>>%ausgabedatei%
	echo then ^(setq Fail 1^)^)>>%ausgabedatei%
	echo(>>%ausgabedatei%
)
echo Fertig
pause > nul

Prüf ob Sonderzeichen auch korrekt ausgegeben werden, wie beispielsweise das µ bei Inftmiµmmmcmmkm.

Gruß Frank
Member: Melmacker
Melmacker Nov 07, 2018 at 20:10:09 (UTC)
Goto Top
Ich kenne mich leider null mit Powershell aus, deswegen habe ich das gefragt.
Aber danke für den Dode mit dem kann ich was anfangen weil mit Batch kenne ich mich aus.

Mfg

Melmacker
Member: Melmacker
Melmacker Nov 07, 2018 at 20:10:55 (UTC)
Goto Top
Danke lummel auf dich ist immer verlass :D

Mfg

Melmacker
Member: Pedant
Pedant Nov 08, 2018 at 09:26:18 (UTC)
Goto Top
Hallo Melmacker,

Zitat von @Melmacker:
...mit Batch kenne ich mich aus.
entweder ist das nicht wahr, denn dann hättest Du diese einfache Aufgabe leicht selbst lösen können
oder das hier trifft doch zu:
"Könntest Du meine Arbeit machen, weil ich heute keinen Bock habe."

Zitat von @Pedant
Prüf ob Sonderzeichen auch korrekt ausgegeben werden, wie beispielsweise das µ bei Inftmiµmmmcmmkm.
Wie geht es Deinem griechischen M oder anders gefragt, war 1252 die richtige Codepage?

Gruß Frank
Member: Melmacker
Melmacker Jan 02, 2019 at 09:57:41 (UTC)
Goto Top
Hallo Pedant,

1. Entschuldige ich mich für die sehr sehr verspätete Antwort
2. Ich meinte damit das ich mich in Batch auskenne aber halt nicht alles kann
3. Ich habe noch so meine Probleme mit for Schleifen deswegen hatte ich nach einen Code gefragt
4. Und wie oben schon erwähnt weiß ich nichts über PowerShell
5. Die Codepage war richtig denn das Programm liest die Zeichen auch so ein denn diese Zeichen haben eine bestimmte Bedeutung für das Programm wie z.B. das Prozent Zeichen afür Variablen in Batch aber was das Zeichen für das Programm bedeutet weiß ich nicht

Mfg

Melmacker
Member: Pedant
Pedant Jan 08, 2019 at 10:12:32 (UTC)
Goto Top
Hallo Melmacker,

zu. 3:
Falls Du das ändern möchtest:
Tutorial zur FOR-Schleife
Tutorial zur FOR-Schleife

zu. 5:
Der Ascii-Dezimalwert des Prozent-Zeichens ist 37.
Das ist daher nicht geeignet, um die Richtigkeit der Codepage zu beurteilen.
interessanter ist das µ bei
AREAUNITS Inftmiµmmmcmmkm
(Inftmiµmmmcmmkm = Inches, Feet, Miles, Mikrometer, Millimeter, Zentimeter, Meter, Kilometer)

Ich würde die Eingabedatei testweise um eine Textzeile ergänzen:
TEST ^°"²§³$%&/(){}=?ß\´`*'#~,;.:+-_<|>@€µ«»½¼
und dann prüfen, ob alle Zeichen korrekt in die Ausgabedatei übertragen werden.
Die Zeichenfolge kannst Du natürlich auch noch erweitern.
Nach erfolgreichem Test gilt es die Testzeile natürlich wieder zu entfernen.

Gruß Frank