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-Key: 232921

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

Printed on: April 23, 2024 at 18:04 o'clock

Member: bastla
Solution bastla Mar 18, 2014 updated at 15:26:41 (UTC)
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
Member: laster
laster Mar 18, 2014 updated at 10:52:54 (UTC)
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
Member: AllForOne94
AllForOne94 Mar 18, 2014 at 10:59:35 (UTC)
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?
Member: colinardo
Solution colinardo Mar 18, 2014 updated at 11:44:59 (UTC)
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
Member: laster
Solution laster Mar 18, 2014 updated at 11:15:08 (UTC)
Goto Top
Die Hex-Umwandlung ist drin, Zeile 25: String.parsInt(value, basis)
Siehe http://www.w3schools.com/jsref/jsref_parseint.asp
VG
LS
Member: laster
laster Mar 18, 2014 at 11:08:28 (UTC)
Goto Top
Hallo Uwe,

NICHT SCHLECHT !

vG
LS
Member: AllForOne94
AllForOne94 Mar 18, 2014 updated at 11:24:36 (UTC)
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.
Member: bastla
Solution bastla Mar 18, 2014 updated at 15:26:24 (UTC)
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
Member: colinardo
Solution colinardo Mar 18, 2014 updated at 15:26:20 (UTC)
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.