CSV zu HTML-Tabelle via Batch
Hallo.
Ich versuche nun schon seit Stunden diese Aufgabe zu lösen.
Leider haben auch Beiträge in diesem Forum oder Google-Ergebnisse nicht geholfen, irgendwie 'will es einfach nicht'.
Ich habe eine Datei
Wobei Notepad++ mir vor und nach dem Namen kein Leerzeichen sondern ein NUL anzeigt... vlt. schon das Problem?
Ich habe es allerdings mit einer 'korrigierten' Datei versucht, das ohne eine Wirkung.
Und mit folgendem Script möchte ich diese gerne in eine HTML-Datei konvertieren:
Doch die HTML-Datei enthält nur die direkten Werte und nichts - auch keine Leerzeile usw. - aus der CSV-Datei.
Sieht jemand das Problem und kann helfen?
Wo ich z.B. schon nachgesehen habe bzw. vorbeigekommen bin:
CSV Datei auslesen per Batch
CSV mit batch bearbeiten - auslesen
http://stackoverflow.com/questions/10685599/loop-through-csv-file-with- ...
http://www.computing.net/answers/programming/parsing-csv-in-a-batch/153 ...
http://stackoverflow.com/questions/17473239/windows-batch-programming-r ...
http://wiki.ljackson.us/For_Command
http://www.robvanderwoude.com/escapechars.php
Danke.
Ich versuche nun schon seit Stunden diese Aufgabe zu lösen.
Leider haben auch Beiträge in diesem Forum oder Google-Ergebnisse nicht geholfen, irgendwie 'will es einfach nicht'.
Ich habe eine Datei
gutscheine.txt
:W15;Paypal;4580909242;Max Mustermann;Eine Straße 11;Musterort;12345;15.00;2014-06-26;0;;0.00;798;Max Mustermann;0.00;Wertgutschein 15,00W30;Paypal;0261088515; Andreas Meier ; Musterstr. 27 ;Musterort;23456;30.00;2014-06-29;0;;0.00;799; Andreas Meier ;0.00; Wertgutschein 30,00 W10;Paypal;1041069589; Susanne Müller ; Bachstrasse 26 ;Musterort;34567;10.00;2014-07-08;0;;0.00;802; Susanne Müller ;0.00; Wertgutschein 10,00
Wobei Notepad++ mir vor und nach dem Namen kein Leerzeichen sondern ein NUL anzeigt... vlt. schon das Problem?
Ich habe es allerdings mit einer 'korrigierten' Datei versucht, das ohne eine Wirkung.
Und mit folgendem Script möchte ich diese gerne in eine HTML-Datei konvertieren:
@echo off
:: Quell- und Zieldatei setzen
set "InputCSV=gutscheine.txt"
set "OutputHTML=gutscheine.html"
:: HTML-Ausgabedatei vorbereiten
> %OutputHTML% ECHO ^<html^>
>>%OutputHTML% ECHO ^<body^>
>>%OutputHTML% ECHO ^<h2^>Gutscheine^</h2^>
>>%OutputHTML% ECHO ^<table^>
>>%OutputHTML% ECHO ^<tr^>^<th^>LfdNr (Dateiname)^</th^>^<th^>Datum^</th^>^<th^>Zahlart^</th^>^<th^>Wert^</th^>^<th^>Name^</th^>^<th^>Strasse^</th^>^<th^>PLZ^</th^>^<th^>ORT^</th^>^</tr^>
:: Inhalte der Quelldatei übernehmen
FOR /f "usebackq tokens=1-16 delims=;" %%a IN ("%InputCSV%") DO @>"%OutputHTML%" (
echo ^<tr^>
echo ^<td^>%%c^</td^>
echo ^<td^>%%i^</td^>
echo ^<td^>%%b^</td^>
echo ^<td^>%%h^</td^>
echo ^<td^>%%d^</td^>
echo ^<td^>%%e^</td^>
echo ^<td^>%%g^</td^>
echo ^<td^>%%f^</td^>
echo ^</tr^>
)
:: HTML-Ausgabedatei abschliessen
>>%OutputHTML% ECHO ^</table^>
>>%OutputHTML% ECHO ^</body^>
>>%OutputHTML% ECHO ^</html^>
Doch die HTML-Datei enthält nur die direkten Werte und nichts - auch keine Leerzeile usw. - aus der CSV-Datei.
Sieht jemand das Problem und kann helfen?
Wo ich z.B. schon nachgesehen habe bzw. vorbeigekommen bin:
CSV Datei auslesen per Batch
CSV mit batch bearbeiten - auslesen
http://stackoverflow.com/questions/10685599/loop-through-csv-file-with- ...
http://www.computing.net/answers/programming/parsing-csv-in-a-batch/153 ...
http://stackoverflow.com/questions/17473239/windows-batch-programming-r ...
http://wiki.ljackson.us/For_Command
http://www.robvanderwoude.com/escapechars.php
Danke.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 267804
Url: https://administrator.de/contentid/267804
Ausgedruckt am: 25.11.2024 um 17:11 Uhr
19 Kommentare
Neuester Kommentar
Hallo WiSch!
Ich hatte es nur kurz mit Deinen geposteten Batch und Testdaten (also ohne die NUL-Zeichen) versucht und damit eine vernünftige html-Datei erhalten ...
Falls es tatsächlich an den NUL-Zeichen liegen sollten, könntest Du diese versuchsweise mit ein wenig VBS ausfiltern:
Grüße
bastla
Ich hatte es nur kurz mit Deinen geposteten Batch und Testdaten (also ohne die NUL-Zeichen) versucht und damit eine vernünftige html-Datei erhalten ...
Falls es tatsächlich an den NUL-Zeichen liegen sollten, könntest Du diese versuchsweise mit ein wenig VBS ausfiltern:
@echo off
:: Quell- und Zieldatei setzen
set "InputCSV=gutscheine.txt"
set "OutputHTML=gutscheine.html"
set "CleanCSV=%temp%\cleancsv.vbs"
>%CleanCSV% echo WScript.Echo Replace(CreateObject("Scripting.FileSystemObject").OpenTextFile(WScript.Arguments(0)).ReadAll, Chr(0), "")
:: HTML-Ausgabedatei vorbereiten
> %OutputHTML% ECHO ^<html^>
>>%OutputHTML% ECHO ^<body^>
>>%OutputHTML% ECHO ^<h2^>Gutscheine^</h2^>
>>%OutputHTML% ECHO ^<table^>
>>%OutputHTML% ECHO ^<tr^>^<th^>LfdNr (Dateiname)^</th^>^<th^>Datum^</th^>^<th^>Zahlart^</th^>^<th^>Wert^</th^>^<th^>Name^</th^>^<th^>Strasse^</th^>^<th^>PLZ^</th^>^<th^>ORT^</th^>^</tr^>
:: Inhalte der Quelldatei übernehmen
FOR /f "tokens=1-16 delims=;" %%a IN ('cscript %CleanCSV% "%InputCSV%"') DO >>"%OutputHTML%" (
echo ^<tr^>
echo ^<td^>%%c^</td^>
echo ^<td^>%%i^</td^>
echo ^<td^>%%b^</td^>
echo ^<td^>%%h^</td^>
echo ^<td^>%%d^</td^>
echo ^<td^>%%e^</td^>
echo ^<td^>%%g^</td^>
echo ^<td^>%%f^</td^>
echo ^</tr^>
)
:: HTML-Ausgabedatei abschliessen
>>%OutputHTML% ECHO ^</table^>
>>%OutputHTML% ECHO ^</body^>
>>%OutputHTML% ECHO ^</html^>
bastla
Hallo WiSch!
Dann ändere mal das
BTW: Wenn die CSV-Datei nicht gefunden wird, solltest Du sowohl bei der Batch-only als auch bei der Variante mit VBS eine entsprechende Fehlermeldung erhalten - in Batch zB
Grüße
bastla
Dann ändere mal das
echo off
auf echo on
und schau Dir den Ablauf des Batches an ...BTW: Wenn die CSV-Datei nicht gefunden wird, solltest Du sowohl bei der Batch-only als auch bei der Variante mit VBS eine entsprechende Fehlermeldung erhalten - in Batch zB
Die Datei "gutscheine.txt" kann nicht gefunden werden.
bastla
Mit Powershell ein Klacks und obendrein zuverlässiger:
Bestimmte Werte aus CSV Datei automatisch in HTML Datei einfügen
Gruß jodel32
Bestimmte Werte aus CSV Datei automatisch in HTML Datei einfügen
Gruß jodel32
Hallo WiSch,
das ist irgendwie verkorkstes UTF-8.
Teste mal folgendes Batch/JScript Hybrid:
*.bat
Ich habe auch versucht das ß vernünftig anzuzeigen, allerdings momentan noch erfolglos.
Grüße
rubberman
das ist irgendwie verkorkstes UTF-8.
Teste mal folgendes Batch/JScript Hybrid:
*.bat
@if (@x)==(@y) @end /*
@echo off &setlocal
:: Quell- und Zieldatei setzen
set "InputCSV=gutscheine.txt"
set "OutputHTML=gutscheine.html"
:: HTML-Ausgabedatei vorbereiten
> %OutputHTML% ECHO ^<!DOCTYPE html^>
>>%OutputHTML% ECHO ^<html lang="de"^>
>>%OutputHTML% ECHO ^<head^>^<meta http-equiv="Content-Type" content="text/html"; charset="utf-8" /^>^</head^>
>>%OutputHTML% ECHO ^<body^>
>>%OutputHTML% ECHO ^<h2^>Gutscheine^</h2^>
>>%OutputHTML% ECHO ^<table^>
>>%OutputHTML% ECHO ^<tr^>^<th^>LfdNr (Dateiname)^</th^>^<th^>Datum^</th^>^<th^>Zahlart^</th^>^<th^>Wert^</th^>^<th^>Name^</th^>^<th^>Strasse^</th^>^<th^>PLZ^</th^>^<th^>ORT^</th^>^</tr^>
:: Inhalte der Quelldatei übernehmen
FOR /f "tokens=1-16 delims=;" %%a IN ('cscript //nologo //e:jscript "%~fs0" "%InputCSV%"') DO >>"%OutputHTML%" (
echo ^<tr^>
echo ^<td^>%%c^</td^>
echo ^<td^>%%i^</td^>
echo ^<td^>%%b^</td^>
echo ^<td^>%%h^</td^>
echo ^<td^>%%d^</td^>
echo ^<td^>%%e^</td^>
echo ^<td^>%%g^</td^>
echo ^<td^>%%f^</td^>
echo ^</tr^>
)
:: HTML-Ausgabedatei abschliessen
>>%OutputHTML% ECHO ^</table^>
>>%OutputHTML% ECHO ^</body^>
>>%OutputHTML% ECHO ^</html^>
exit /b
*/
var strFileName = WScript.Arguments(0);
var objFSO, objFile, strLine;
objFSO = WScript.CreateObject("Scripting.FileSystemObject");
objFile = objFSO.OpenTextFile(strFileName);
while (!objFile.AtEndOfStream)
{
strLine = objFile.ReadLine().replace(/\0/g, '');
WScript.Echo(strLine);
}
Grüße
rubberman
Zitat von @WiSch:
Hallo jodel32.
Mit Powershell hab ich mich noch nicht (wirklich) beschäftigt.
Aber das genannte Script habe ich mal zum Test übernommen, die Dateipfade sowie Trennzeichen angepassee,
die PS-Ausführung auf meinem Rechner erlaubt und das Script ausgeführt: Die HTML enthält keine Daten!
Das ist dann deiner Powershell-Unkenntnis geschuldet... Es sind die Spaltennamen natürlich auch anzupassen so ganz ohne Anpassung lässt sich das ja nicht übernehmen.Hallo jodel32.
Mit Powershell hab ich mich noch nicht (wirklich) beschäftigt.
Aber das genannte Script habe ich mal zum Test übernommen, die Dateipfade sowie Trennzeichen angepassee,
die PS-Ausführung auf meinem Rechner erlaubt und das Script ausgeführt: Die HTML enthält keine Daten!
Wenn das File keine Überschriften hat muss man die dem CMDLet Import-CSV mitgeben.
Und mit UTF8 kommt Powershell problemlos klar aber jeder wie er's mag ....
Und sortieren geht damit auch super easy.
Gruß jodel32
Set-StrictMode -Version 3
# Pfad zur CSV Datei
$FILECSV = "C:\temp\test.csv"
# Ausgabepfad für HTML-File
$FILEHTMLOUT = "C:\temp\test_html.html"
#CSV-Datei importieren
$csv = Import-csv $FILECSV -Delimiter ";" -Header '1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16' -Endoding UTF8
#sortieren
$csv = $csv | sort -property '9'
$tablerows = @()
# Für jede Zeile in der CSV-Datei eine HTML-Zeile erstellen
foreach($line in $csv){
$cols = 1..16 | %{"<td>$($line.$_)</td>"}
$tablerows += @"
<tr>
$cols
</tr>
"@
}
# HTML Template mit erzeugten Zeilen erstellen
$htmltemplate = @"
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>HTML Template</title>
</head>
<body>
<table border="1" width="">
$tablerows
</table>
</body>
</html>
"@
# HTML in Datei ausgeben
$htmltemplate | set-content $FILEHTMLOUT
Hallo WiSch,
sollte etwa so funktionieren (das Datum wird als zusätzliches Token noch einmal vorangestellt, darum rücken die FOR Variablen um einen Buchstaben weiter).
Grüße
rubberman
sollte etwa so funktionieren (das Datum wird als zusätzliches Token noch einmal vorangestellt, darum rücken die FOR Variablen um einen Buchstaben weiter).
@if (@x)==(@y) @end /*
@echo off &setlocal
:: Quell- und Zieldatei setzen
set "InputCSV=gutscheine.txt"
set "OutputHTML=gutscheine.html"
:: HTML-Ausgabedatei vorbereiten
> %OutputHTML% ECHO ^<!DOCTYPE html^>
>>%OutputHTML% ECHO ^<html lang="de"^>
>>%OutputHTML% ECHO ^<head^>^<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /^>^</head^>
>>%OutputHTML% ECHO ^<body^>
>>%OutputHTML% ECHO ^<h2^>Gutscheine^</h2^>
>>%OutputHTML% ECHO ^<table^>
>>%OutputHTML% ECHO ^<tr^>^<th^>LfdNr (Dateiname)^</th^>^<th^>Datum^</th^>^<th^>Zahlart^</th^>^<th^>Wert^</th^>^<th^>Name^</th^>^<th^>Strasse^</th^>^<th^>PLZ^</th^>^<th^>ORT^</th^>^</tr^>
:: Inhalte der Quelldatei übernehmen
FOR /f "tokens=1-10 delims=;" %%a IN ('cscript //nologo //e:jscript "%~fs0" "%InputCSV%"') DO >>"%OutputHTML%" (
echo ^<tr^>
echo ^<td^>%%d^</td^>
echo ^<td^>%%j^</td^>
echo ^<td^>%%c^</td^>
echo ^<td^>%%i^</td^>
echo ^<td^>%%e^</td^>
echo ^<td^>%%f^</td^>
echo ^<td^>%%h^</td^>
echo ^<td^>%%g^</td^>
echo ^</tr^>
)
:: HTML-Ausgabedatei abschliessen
>>%OutputHTML% ECHO ^</table^>
>>%OutputHTML% ECHO ^</body^>
>>%OutputHTML% ECHO ^</html^>
exit /b
*/
var strFileName = WScript.Arguments(0);
var objFSO, objFile, strLine, arrLines = , i = 0;
objFSO = WScript.CreateObject("Scripting.FileSystemObject");
objFile = objFSO.OpenTextFile(strFileName);
while (!objFile.AtEndOfStream)
{
strLine = objFile.ReadLine().replace(/\0/g, '');
arrLines.push(strLine.split(';')[8] + ';' + strLine);
}
arrLines.sort();
for (; i < arrLines.length; ++i)
{
WScript.Echo(arrLines[i]);
}
rubberman
Zitat von @WiSch:
@114757:
Das Script läuft auf den Fehler "Es wurde kein Parameter gefunden, der dem Parametername "Encoding"
entspricht".
Den Parameter gibt's erst ab Powershell 3.0 ist aber nur in seltenen Fällen nötig wenn das File kein BOM hat.@114757:
Das Script läuft auf den Fehler "Es wurde kein Parameter gefunden, der dem Parametername "Encoding"
entspricht".
Ohne diesen Parameter läuft das Script durch, hat dann aber in der Ausgabe - wahrscheinlich deshalb - auch die Umlaute
zerschossen.
Das liegt dann nur an der Browserausgabe habe das in der HTML-Datei gefixt...zerschossen.
Wie würde ich nur bestimmte Spalten ausgeben, deren Reihenfolge verändern und nach der Datumsspalte sortieren?
Siehe hier, sollte dann selbsterklärend sein...# Pfad zur CSV Datei
$FILECSV = "C:\temp\gutscheine.txt"
# Ausgabepfad für HTML-File
$FILEHTMLOUT = "C:\temp\test_html.html"
#CSV-Datei importieren
$csv = Import-csv $FILECSV -Delimiter ";" -Header '1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16'
#sortieren nach Datumsspalte
$csv = $csv | sort -property '9'
$tablerows = @()
# Für jede Zeile in der CSV-Datei eine HTML-Zeile erstellen
foreach($line in $csv){
$tablerows += @"
<tr>
<td>$($line.'3')</td>
<td>$($line.'9')</td>
<td>$($line.'2')</td>
<td>$($line.'8')</td>
<td>$($line.'4')</td>
<td>$($line.'5')</td>
<td>$($line.'7')</td>
<td>$($line.'6')</td>
</tr>
"@
}
# HTML Template mit erzeugten Zeilen erstellen
$htmltemplate = @"
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html">
<title>HTML Template</title>
</head>
<body>
<table border="1" width="">
$tablerows
</table>
</body>
</html>
"@
# HTML in Datei ausgeben
$htmltemplate | set-content $FILEHTMLOUT
Hallo WiSch.
Grüße
rubberman
EDIT:
Vergiss es, mit Batch und cscript wird das nix.
JScript Stand-Alone (Dateiendung .js):
die Sorterung ändert die Reihenfolge innerhalb eines Satzes und nicht die Sortierung der Sätze selbst.
Öhm, nein. Lediglich das Datum wird noch einmal (als zusätzliches Token) vorangestellt, um die Sortierung als String vornehmen zu können. Sollte also so funktionieren, wie ich es oben beschrieben habe.Die zerschossenen Umlaute wären da eher ein Aufwand wert.
Das ist fast ein Ding der Unmöglichkeit, da Consoletools (wegen der unterschiedlichen Zeichencodierung zwischen Windows- und Consoleanwendungen) den Zeichensatz bereits beim Lesen zerschießen. Ich versuche mich noch mal an einer Lösung, aber versprechen kann ich nichts. Vermutlich sollte man gleich ganz auf Windows-Scripting (VBScript oder JScript in Verbindung mit wscript.exe) zurückgreifen ...Grüße
rubberman
EDIT:
Vergiss es, mit Batch und cscript wird das nix.
JScript Stand-Alone (Dateiendung .js):
var strInputCSV = 'gutscheine.txt';
var strOutputHTML = 'gutscheine.html';
var objFSO, objFile, strLine, arrLines = , arrData, i = 0;
objFSO = WScript.CreateObject('Scripting.FileSystemObject');
objFile = objFSO.OpenTextFile(strInputCSV);
while (!objFile.AtEndOfStream)
{
strLine = objFile.ReadLine().replace(/\0/g, '');
arrLines.push(strLine.split(';')[8] + ';' + strLine);
}
objFile.Close();
arrLines.sort();
objFile = objFSO.OpenTextFile(strOutputHTML, 2, true);
objFile.WriteLine('<!DOCTYPE html>');
objFile.WriteLine('<html lang="de">');
objFile.WriteLine('<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>');
objFile.WriteLine('<body><h2>Gutscheine</h2><table>');
objFile.WriteLine('<tr><th>LfdNr (Dateiname)</th><th>Datum</th><th>Zahlart</th><th>Wert</th><th>Name</th><th>Strasse</th><th>PLZ</th><th>ORT</th></tr>');
for (; i < arrLines.length; ++i)
{
arrData = arrLines[i].split(';');
objFile.WriteLine('<tr><td>' + arrData[3] + '</td>'
+ '<td>' + arrData[9] + '</td>'
+ '<td>' + arrData[2] + '</td>'
+ '<td>' + arrData[8] + '</td>'
+ '<td>' + arrData[4] + '</td>'
+ '<td>' + arrData[5] + '</td>'
+ '<td>' + arrData[7] + '</td>'
+ '<td>' + arrData[6] + '</td></tr>');
}
objFile.WriteLine('</table></body></html>');
objFile.Close();