allforone94
Goto Top

Batch-Problem Inhalt aus Datei auslesen, bearbeiten und dann wieder speichern

Hallo Com,
Ich habe eigentlich ein relativ simples Problem.

Meine Ausgangsdatei ist so aufgebaut:
0,00h
1,00h
2,18h
3,00h
4,00h
5,00h
6,00h
7,00h
8,00h
9,00h
10,00h
11,00h
12,00h
13,00h
14,00h
15,00h
16,4Fh
17,80h
18,80h
19,80h
231,00h
232,00h

Es ist eine txt-Datei.
Ich möchte jetzt, dass der Inhalt eingelesen wird und folgendermaßen wieder ausgegeben wird.

/sc00000/sc00100/sc00218

Also der Aufbau ist:
/s + c0 + Zahl vor dem Komma in Hexadezimal umwanlden + Zahl nach dem Komma ohne h hinschreiben.

Das ganze soll dann wieder in einer txt-Datei ausgegeben werden.

Ich habe mir gedacht, dass es mit Batch ganz gut. Nur ich habe viel zu wenig Ahnung davon und bin so auf etwas Unterstützung angewiesen.

Vielen Dank

Content-ID: 232921

Url: https://administrator.de/forum/batch-problem-inhalt-aus-datei-auslesen-bearbeiten-und-dann-wieder-speichern-232921.html

Ausgedruckt am: 09.04.2025 um 18:04 Uhr

bastla
Lösung bastla 18.03.2014 aktualisiert um 16:26:41 Uhr
Goto Top
Hallo AllForOne94 und willkommen im Forum!

Ich würde (hinsichtlich der Konvertierung in Hex) VBS bevorzugen, das ließe sich aber zur Not auch in Batch erledigen - allerdings ist mir die gewünschte Ausgabe nicht wirklich klar: Soll aus der gesamten Datei tatsächlich nur eine Zeile entstehen, bzw wie viele Zeilen der Ausgangsdatei (lt Deinem Beispiel wären das zunächst einmal 3) sollen zu einer Zeile in der Ergebnisdatei zusammengefasst werden?

Soferne jeweils wieder eine eigene Zeile entstehen soll, als VBScript etwa so:
Ein = "D:\Ausgangsdatei.txt"  
Aus = "D:\Ergebnisdatei.txt"  

Set fso = CreateObject("Scripting.FileSystemObject")  
Daten = Split(fso.OpenTextFile(Ein).ReadAll, vbNewline)

For Each Zeile In Daten
    If Trim(Zeile) <> "" Then  
        Werte = Split(Replace(Zeile, "h", ""), ",")  
        Ausgabe = Ausgabe & vbNewLine & "/sc0" & Right("0" & Hex(Werte(0)), 2) & Werte(1)  
    End If
Next
fso.CreateTextFile(Aus).Write Mid(Ausgabe, 3)
[Edit] Da wir nun wissen, dass es nur eine Ausgabezeile geben soll, wäre die Zeile 10 auf
Ausgabe = Ausgabe & "/sc0" & Right("0" & Hex(Werte(0)), 2) & Werte(1)
und die Zeile 13 auf
so.CreateTextFile(Aus).Write Ausgabe
zu ändern.
[/Edit]

Grüße
bastla
laster
laster 18.03.2014 aktualisiert um 11:52:54 Uhr
Goto Top
Hallo,

hier eine Möglichkeit mit JScript (als ausbaufähige Vorlage):

// Ein- uns Ausgabe DateieNamen definieren
var src="___in.txt";  
var dst="___out.txt";  

// Ein- und Ausgabe Dateien oeffnen
var fp1 = OpenFile(src, "r");    
var datei = fp1.ReadAll();
fp1.Close();

var fp2 = CreateFile(dst);

// Hilfsvariablen
var zeile = "";  
var s1 = "";  
var s2 = "";  
var zeileOut = "";  
var i = 0;
var x = 0;
var saZeilen = datei.split("\r\n");  
for (i = 0; i < saZeilen.length; i++) {
  zeile = saZeilen[i];
  if (zeile.indexOf(",") > 0) {  
    // Teil vor dem Komma
    s1 = zeile.split(",");   
    s1 = parseInt(s1,16);
    // Teil nach dem Komma
    s2 = zeile.split(",")[1];  
    s2 = s2.substring(0, s2.length - 1);
    // ... und zusammenbauen
    zeileOut = "/sc0" + s1 + "/sc0" + s2;  
    fp2.WriteLine(zeileOut);
    x++;
  }
}
fp2.Close();

WScript.Echo("OK, "+x+" Zeilen gelesen und ...");    

/////////////////////////////////////////////////////////////////////////////////////////////

/** Create TextDatei.
 * @param name String kompletter Dateiname
 * @return tf  Objekt FilePointer
 */
function CreateFile(name) {
  var fso, tf;
  fso = new ActiveXObject("Scripting.FileSystemObject");  
  tf = fso.CreateTextFile(name, true);
  return tf;
}

/** Open TextDatei.
 * @param name String kompletter Dateiname
 * @return tf  Objekt FilePointer
 */
function OpenFile(name, mod) {
  var fso, tf, mode;
  if (mod == "r") {  
    mode = 1;
  }  
  if (mod == "w") {  
    mode = 2;
  }  
  if (mod == "a") {  
    mode = 8;
  }  
  fso = new ActiveXObject("Scripting.FileSystemObject");  
  tf = fso.OpenTextFile(name, mode);
  return tf;
}

VG
LS
AllForOne94
AllForOne94 18.03.2014 um 11:59:35 Uhr
Goto Top
Ja ok habe ich etwas unsauber formuliert.
Es soll wie du richtig angenommen hast nur eine Zeile entstehen.
In der Ausgangsdatei sind es 233 Zeilen.

Das JScript sieht schon mal ganz gut.
Die Hex-Umwandlung ist noch nicht drin oder?
colinardo
Lösung colinardo 18.03.2014 aktualisiert um 12:44:59 Uhr
Goto Top
Hi,
ungefähr so ?
@echo off & setlocal ENABLEDELAYEDEXPANSION
set "fileIN=c:\daten_in.txt"  
set "fileOUT=C:\daten_out.txt"  
for /f "usebackq tokens=1,2 delims=," %%a in ("%fileIN%") DO @(  
	call :toHex %%a hex
	set nachkomma=%%b
	set nachkomma=!nachkomma:~0,2!
	set merge=!merge!/sc!hex!!nachkomma!
)
echo !merge!>"%fileOUT%  
goto end

:toHex
set /a dec=%~1
set "hex="  
set "map=0123456789ABCDEF"  
for /L %%N in (1,1,8) do (
    set /a "d=dec&15,dec>>=4"  
    for %%D in (!d!) do set "hex=!map:~%%D,1!!hex!"  
)
set "hex=!hex:~5,3!  
( 
    ENDLOCAL
    SET %~2=%hex%
)
goto :eof

:end
Quelle toHex-Funktion: dostips.com

Grüße Uwe
laster
Lösung laster 18.03.2014 aktualisiert um 12:15:08 Uhr
Goto Top
Die Hex-Umwandlung ist drin, Zeile 25: String.parsInt(value, basis)
Siehe http://www.w3schools.com/jsref/jsref_parseint.asp
VG
LS
laster
laster 18.03.2014 um 12:08:28 Uhr
Goto Top
Hallo Uwe,

NICHT SCHLECHT !

vG
LS
AllForOne94
AllForOne94 18.03.2014 aktualisiert um 12:24:36 Uhr
Goto Top
Ja Uwe das funktioniert ja mal perfekt.
Herzlichen Dank!
Ich hätte Jahre gebraucht....

Edit: Ein kleines Problem gibt es noch.
Am Anfang wenn 01 etc nur einstellig ist wird statt 01 nur 1 geschrieben. Ich bräuchte aber ein 01.
bastla
Lösung bastla 18.03.2014 aktualisiert um 16:26:24 Uhr
Goto Top
Hallo AllForOne94!
Am Anfang wenn 01 etc nur einstellig ist wird statt 01 nur 1 geschrieben. Ich bräuchte aber ein 01.
Sollte in der VBS-Variante funktionieren ...

Grüße
bastla
colinardo
Lösung colinardo 18.03.2014 aktualisiert um 16:26:20 Uhr
Goto Top
Zitat von @AllForOne94:
Edit: Ein kleines Problem gibt es noch.
Am Anfang wenn 01 etc nur einstellig ist wird statt 01 nur 1 geschrieben. Ich bräuchte aber ein 01.
ist angepasst.