newplay123
Goto Top

Batch : TXT-Datei auslesen

Hallo,

ich habe eine Textdatei mit dem Inhalt " "Test" ".
Also die zweiten Anführungszeichen sind auch mit in der txt Datei .
Ich möchte diese Datei jetzt über eine Batch Datei auslesen und das Ergebnis als Variable speichern, da sie später noch benutzt wird.

Wenn ich es jetzt aber mit
SET /p name=<C:\Test\TEMP\Datei.txt

echo %name%

ausprobiere kommt am Ende als echo nur " " ", also nur ein Anführungszeichen raus, wie kann ich es ändern das der ganze Inhalt wiedergegeben wird?

Mit freundlichen Grüßen
Jan

Content-Key: 482027

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

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

Member: Kraemer
Kraemer Aug 06, 2019 at 09:13:34 (UTC)
Goto Top
Moin,

hast du noch immer nicht gemerkt, dass Batch das falsche Mittel der Wahl ist?

Gruß
Mitglied: 140447
140447 Aug 06, 2019 updated at 09:16:23 (UTC)
Goto Top
Wie ich in deinem letzten Beitrag (auf den du nicht geantwortet hast) schon mal gesagt habe, das Encoding deiner Textdatei stimmt in dem Fall nicht mit dem der Konsole überein, denn mit einem normalen ANSI File geht das hier problemlos. Also prüfe das Encoding oder steige am besten gleich auf Powershell um.
Member: Newplay123
Newplay123 Aug 06, 2019 at 09:28:25 (UTC)
Goto Top
Hallo,

Ich erzeuge mit einem PowerShell Skript die CSV Datei.
Skript sieht so aus :

[int]$line =3
$csv = import-csv C:\stundenzettel\Import\import.csv -Header "Benutzername","Vorname","Nachname","Abteilung","Personal Nr.","Datum","Hinein","Hinaus","Dienstplan","Dauer","Saldo","Tage","Pause hinein","Pause hinaus","Dauer ohne Pause","Bemerkung","Urlaub" -Delimiter "`t"  
$spaltenname = "Nachname"  
$csv[($line - 1)] | select -Property $spaltenname | ConvertTo-Csv -NoTypeInformation -Delimiter "`t"  | select -Skip 1 |  Set-Content C:\stundenzettel\TEMP\Test.csv  

Die daraus entstandene CSV Datei will ich jetzt wiederum in einer Batch Datei einlesen, wie geht dies dann bzw was muss ich in der PowerShell verändern damit die CSV Datei Problemlos in der Batch Datei eingelesen wird ?
Member: Newplay123
Newplay123 Aug 06, 2019 at 09:29:02 (UTC)
Goto Top
Wie soll ich dies denn deiner Meinung nach anders machen ?
Mitglied: 140447
140447 Aug 06, 2019 updated at 09:34:33 (UTC)
Goto Top
Bei einer Spalte ist das überflüssiger Overhead ...
[int]$line =3
$csv = import-csv 'C:\stundenzettel\Import\import.csv' -Header "Benutzername","Vorname","Nachname","Abteilung","Personal Nr.","Datum","Hinein","Hinaus","Dienstplan","Dauer","Saldo","Tage","Pause hinein","Pause hinaus","Dauer ohne Pause","Bemerkung","Urlaub" -Delimiter "`t"  
$csv[($line - 1)] | select -Expand Nachname | Set-Content 'C:\stundenzettel\TEMP\Test.csv' -Encoding Default  
Member: dwaldmannDE
dwaldmannDE Aug 06, 2019 at 09:33:07 (UTC)
Goto Top
Hallo Newplay123,

ich kann meinen Vorrednern hier nur recht geben - Batch ist hier nicht mehr zeitgemäß. Du machst ja schon irgendwas in PowerShell, dann kannst du auch bei PowerShell bleiben. Was hast du eigentlich konkret vor?

Du importierst eine CSV und exportierst diese wieder? Wählst aber nur eine Spalte davon aus?

Versuch es mal so:

Export-CSV -encoding

Gruß
Daniel
Member: Newplay123
Newplay123 Aug 06, 2019 at 09:47:40 (UTC)
Goto Top
Wenn ich es jetzt aber mit :
set /p Name=<C:\stundenzettel\TEMP\Test.csv
echo %Name%

versuche ,dann kommt als echo nur "%Name%" wieder raus und nicht der Inhalt der CSV-Datei.
Mitglied: 140447
140447 Aug 06, 2019 updated at 09:55:35 (UTC)
Goto Top
dann kommt als echo nur "%Name%"
In dem Fall ist deine Datei leer.
Schreib mal das hier in die Batch (nicht in die Konsole! Dort müsstest du aus den doppelten einfach Prozentzeichen machen)
@echo off
for /f "usebackq delims=" %%a in ("C:\stundenzettel\TEMP\Test.csv") do set "Name=%%a"  
echo %Name%
Wir kennen den Inhalt deiner ursprünglichen CSV Datei nicht, mal wieder Glaskugel polishing ... face-confused
Member: Newplay123
Newplay123 Aug 06, 2019 at 09:55:31 (UTC)
Goto Top
Dann kommt ,wenn ich die Batch ausführe, die Ausgabe : "ECHO ist ausgeschaltet (OFF)."
Mitglied: 140447
140447 Aug 06, 2019 updated at 10:07:05 (UTC)
Goto Top
Wie gesagt dann ist deine Datei leer.
Wir kennen den Inhalt deiner ursprünglichen CSV Datei nicht, mal wieder Glaskugel polishing ... face-confused. Du selektierst da mit Index und wir wissen ja nicht ob der überhaupt korrekt ist mangels Quelldaten!

Es wäre ja so einfach mal Ist Zustand ausführlich in Codetags zu posten stattdessen müssen wir dir alles aus der Nase ziehen face-sad. Denn es funktioniert hier ja einwandfrei, also liegt es an deinen Ausgangsdaten.
Member: Newplay123
Newplay123 Aug 06, 2019 at 10:06:51 (UTC)
Goto Top
Die Haupt CSV Datei sieht so aus :

import.csv

Mit dem PowerShell Skript :

[int]$line =3
$csv = import-csv C:\stundenzettel\Import\import.csv -Header "Benutzername","Vorname","Nachname","Abteilung","Personal Nr.","Datum","Hinein","Hinaus","Dienstplan","Dauer","Saldo","Tage","Pause hinein","Pause hinaus","Dauer ohne Pause","Bemerkung","Urlaub" -Delimiter "`t"  
$csv[($line - 1)] | select -Expand Nachname | Set-Content 'C:\stundenzettel\TEMP\Test.csv' -Encoding Default  

Versuch ich jetzt, in diesem fall die Spalte "Nachname" auszulesen und einzeln in eine CSV Datei zu schreiben.

Die Fertige "Test.csv" Datei sieht dann so aus :

test.csv

Die dadurch entstandene "Test.csv" Datei versuche ich dann wiederum in einer Batch einzulesen und in diesem Fall als echo wiederzugeben, dies muss aber auch in einer Batch Datei bleiben.
Die dafür vorhandene Batch Datei sieht so aus :

@echo off
for /f "usebackq delims=" %%a in ("C:\stundenzettel\TEMP\Test.csv") do set name=%%a  
echo %name%
pause>null

Wenn ich diese Datei dann ausführe kommt in der Batch Datei nur "ECHO ist ausgeschaltet (OFF). raus, obwohl ja ein Inhalt in der CSV-Datei ist.
Mitglied: 140447
140447 Aug 06, 2019 updated at 10:11:18 (UTC)
Goto Top
Die Anzeige in Excel ist Schall und Rauch! Lass es in einem Text-Editor anzeigen der auch unsichtbare Zeichen darstellt wie z.B. Notepad++.
do set name=%%a
Zweitens solltest du richtig kopieren lernen, du hast die Anführungszeichen aus meinem Code nicht mit übernommen.
Drittens lass dir das Encoding der Datei in Notepad++ anzeigen
Member: Newplay123
Newplay123 Aug 06, 2019 updated at 10:15:25 (UTC)
Goto Top
Notepad++ sagt der Inhalt der Test.csv Datei sieht so aus :
test.csv2

Warum sind da die "NUL" nach jeden Buchstaben ?


Die Anführungszeichen hab ich wirklich übersehen, wurden geändert.
Mitglied: 140447
Solution 140447 Aug 06, 2019 updated at 10:17:54 (UTC)
Goto Top
Zitat von @Newplay123:

Notepad++ sagt der Inhalt der Test.csv Datei sieht so aus :
Na da hast du dein Problem.

Warum sind da die "NUL" nach jeden Buchstaben ?
Du hast beim Import mit Import-CSV das Encoding nicht passend auf die Quelldatei definiert Parameter -Encoding!!
Das Encoding dieser kennst wieder nur du. Wir haben die Quelldaten nicht, lade sie in Notepad++ und lass dir das Encoding anzeigen.
Wo habe ich Anführungszeichen vergessen ?
Vergleiche mit meiner Zeile oben dann sieht das ein Blinder mit Krückstock!
Mitglied: 140447
140447 Aug 06, 2019 at 10:21:18 (UTC)
Goto Top
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...

-Encoding

Specifies the encoding for the imported CSV file. The default value is UTF8NoBOM.

The acceptable values for this parameter are as follows:

ASCII: Uses the encoding for the ASCII (7-bit) character set.
BigEndianUnicode: Encodes in UTF-16 format using the big-endian byte order.
OEM: Uses the default encoding for MS-DOS and console programs.
Unicode: Encodes in UTF-16 format using the little-endian byte order.
UTF7: Encodes in UTF-7 format.
UTF8: Encodes in UTF-8 format.
UTF8BOM: Encodes in UTF-8 format with Byte Order Mark (BOM)
UTF8NoBOM: Encodes in UTF-8 format without Byte Order Mark (BOM)
UTF32: Encodes in UTF-32 format.
Member: Newplay123
Newplay123 Aug 06, 2019 at 10:24:48 (UTC)
Goto Top
Zitat von @140447:
Du hast beim Import mit Import-CSV das Encoding nicht passend auf die Quelldatei definiert Parameter -Encoding!!
Das Encoding dieser kennst wieder nur du. Wir haben die Quelldaten nicht, lade sie in Notepad++ und lass dir das Encoding anzeigen.

Das Encoding der Haupt Datei ist "UCS-2 Little Endian"(hab ich noch nie von gehört),dies wird aber von einem Programm so gemacht und kann ich nicht ändern. Dies muss so bleiben.

Ich entschuldige mich hier schon mal und danke dir das du mir trotzdem so hilfst.

Wie muss ich jetzt das -Encoding Parameter anpassen damit es funktioniert ?
Mitglied: 140447
Solution 140447 Aug 06, 2019 updated at 10:47:07 (UTC)
Goto Top
Schreib folgendes in die Batch dann ist das extra Powershell-Skript und die extra Ausgabedatei überflüssig
@echo off
for /f "delims=" %%a in ('powershell -EP Bypass -NoP -C "Import-CSV 'C:\stundenzettel\Import\import.csv' -Delimiter \"`t\" -header 'Benutzername','Vorname','Nachname','Abteilung','Personal Nr.','Datum','Hinein','Hinaus','Dienstplan','Dauer','Saldo','Tage','Pause hinein','Pause hinaus','Dauer ohne Pause','Bemerkung','Urlaub' -Encoding Unicode | select -Index 2 -Expand Nachname"') do set "name=%%a"  
echo %name%
Funktioniert hier mit UCS-2 LE (Vorgänger von UTF-16) einwandfrei.
Member: Newplay123
Newplay123 Aug 06, 2019 at 10:46:13 (UTC)
Goto Top
DANKE!!!

Ich habe einfach die Haupt Datei das Encoding geändert, so hat es funktioniert.

Danke für die Hilfe!
Member: Kraemer
Kraemer Aug 06, 2019 at 10:48:54 (UTC)
Goto Top
Zitat von @Newplay123:
Wie muss ich jetzt das -Encoding Parameter anpassen damit es funktioniert ?
du lässt dir auch alles vorkauen oder? Eine kurze Google-Suche hätte dir gesagt das UCS-2 eine Form von UTF-16 ist - dann ein Blick in die Tabelle oben und Überraschung:
Unicode: Encodes in UTF-16 format using the little-endian byte order.
Member: Kraemer
Kraemer Aug 06, 2019 at 10:50:14 (UTC)
Goto Top
Zitat von @Newplay123:
Ich habe einfach die Haupt Datei das Encoding geändert, so hat es funktioniert.
das ist keine Lösung - das ist ein Workaround