merben
Goto Top

Werteuebergabe von csv-file in Javascript

Hallo zusammen,
fuer mein Studium muss ich derzeit einen Microcontroller ueber JavaScript programmieren. Das funktioniert auch soweit alles wie es soll, nur habe ich jetzt ein Problem bei der Uebergabe von meinen Werten.

Und zwar moechte ich eine bestehende .csv Datei auswerten (ehemals Excel Datei) in welcher an verschiedenen Stellen ein x steht. Die Excel ist eine Matrix mit verschiedenen Tests(Spalten) und den verschiedenen Testdurchlaeufen(Zeilen).
Die auszufuehrendenen Tests werden mit einem x markiert. fest definiert ist eigentlich nur die Anzahl an Testdurchlaeufen (22Durchlaeufe bei denen jeweils von 28 Tests die gewuenschten tests ausgefuehrt werden koennen).

Das ganze soll letztendlich ueber eine batch gestartet werden.

Wie wuerdet ihr das Problem angehen? oder gibts da vlt eine Alternative Moeglichkeit welche man ohne riessige Einarbeitungsphase hinbekommt? Ich sitze da jetzt schon den ganzen morgen ohne Lichtblick dran...

Die Ausfuehrung ueber eine Bat und einen JS-Script ist leider Vorgabe...

danke schonmal fuer eure Hilfe!

Content-Key: 218885

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

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

Member: colinardo
colinardo Oct 09, 2013 updated at 12:42:54 (UTC)
Goto Top
Hallo merben,
du kannst Parameter an dein JavaScript-File direkt in der Batch übergeben:
wscript.exe //B //NOLOGO deinScript.js Parameter1 Parameter2

In deinem Javascript-File kannst du dann folgendermaßen auf die Parameter zugreifen:
objArgs = WScript.Arguments;
for (i = 0; i < objArgs.length; i++)
{
   WScript.Echo(objArgs(i));
}
Grüße Uwe
Member: merben
merben Oct 09, 2013 at 14:43:25 (UTC)
Goto Top
Hallo Uwe,
danke fuer deine Antwort!
Meine Aufgabenstellung hat sich in der Zwischenzeit ein bisschen geaendert aber ich schaue jetzt mal ob ich mit deinen Tipps trotzdem weiterkomme! Vielen Dank schonmal
Member: colinardo
colinardo Oct 09, 2013 at 15:33:07 (UTC)
Goto Top
Also wenn du uns mal einen Auszug aus deiner CSV-Datei geben könntest, könnten wir dir da etwas zusammenbauen.
Wenn es unbedingt Batch sein muss, ließe sich die CSV-Datei einfach mit einer FOR /F Schleife durchlaufen und die jeweiligen Felder auf das "x" hin auswerten und weiterverarbeiten...das ist kein Problem!

Grüße Uwe
Member: merben
merben Oct 10, 2013 at 06:41:13 (UTC)
Goto Top
Guten Morgen!
Das waere natuerlich genial wenn ihr mir soweit helfen koenntet!!!!!

Die csv sieht im grossen und ganzen so aus:


Pruefen,,,,,,,,,,,,,,TestNr,Option,Kategorie,,,,
1,,,,,,,,,,,,,,Test1,,,,,,
,,,,,,,,,,,,,,Test2,,,,,,
,,,,,,,,,,,,,,Test3,,,,,,
1,,,,,,,,,,,,,,,Test4,,,,,

das ganze einige Zeilen laenger aber es muss immer nur der erste Wert abgefragt werden (von Zeile 2 bis 29). Das ganze ist auch lueckenlos, also keine Unterbrechung in den Zeilen. Bei einer 1 muss dann der gewuenschte Test ausgefuehrt werden. Ich haette dann einfach alle Werte an das JS uebergeben und dann Spalte fuer Spalte auf eine 1 abgefragt und dementsprechend den Test durchgefuehrt oder nicht.

Die 1 kann natuerlich auch ein x sein. Waere auch schoener! dachte nur dass die 1 einfacher zu verarbeiten ist...


danke schonmal! ihr wuerdet mir einen riessigen gefallen tun. Habe da gestern gefuehlt 10std damit verbracht face-big-smile
Member: colinardo
colinardo Oct 10, 2013 updated at 07:52:04 (UTC)
Goto Top
Moin merben,
das folgende Script setzt jetzt voraus das deine Tests in Spalte 15 stehen. In Zeile 2 musst du noch den Pfad zu deiner CSV-Datei eintragen. Was das Script jetzt macht ist folgendes: Es geht jede Zeile außer der ersten durch prüft ob in der ersten Spalte eine '1' steht und wenn ja hängt es den Wert in Spalte 15 an eine Variable ACTIVETESTS an. In dieser Variablen stehen nachher alle Tests mit Komma voneinander getrennt die durchgeführt werden sollen. In der letzten Zeile wird dann diese Variable als Parameter an dein JavaScript übergeben (die Zeile ist noch durch ein echo quasi auskommentiert damit du überprüfen kannst ob die richtigen Tests übergeben werden.
@echo off & setlocal EnableDelayedExpansion
set "CSVFILE=c:\csv\test.csv"  
set ACTIVETESTS=
for /f "usebackq skip=1 delims=" %%a IN ("!CSVFILE!") DO @(  
  set "line=%%a"  
  set "line="!line:,=","!""  
  for /f "tokens=1,15 delims=," %%A IN ("!line!") DO @(  
     if %%~A == 1 (
      if "!ACTIVETESTS!" == "" (  
         set ACTIVETESTS=%%~B
      ) else (
	 set ACTIVETESTS=!ACTIVETESTS!,%%~B
      )
     )
  )
)
echo Folgende Tests werden durgefuehrt: !ACTIVETESTS!
echo wscript.exe //B //NOLOGO JavaScript.js "!ACTIVETESTS!"  
Hoffe das hilft dir erst mal weiter face-wink

Grüße Uwe
p.s. Warum Ihr alle immer mit Batch arbeiten sollt verstehe wer will ... wir arbeiten ja auch nicht mehr mit DOS 6.2 ...
Ich glaube die alten Profs können nicht von Ihren Gewohnheiten lassen, und sind zu faul mal eine neue Sprache zu lernen.
Member: merben
merben Oct 10, 2013 at 07:52:51 (UTC)
Goto Top
Vielen vielen vielen Dank! Ich mach mich jetzt dann mal an die Umsetzung und melde mich nochmal wenn alles laeuft face-wink

Hat vlt was erhalten von Traditionen zu tun^^ ich verstehe es auch nicht so recht warum mein Prof so verpicht drauf ist...
Member: colinardo
colinardo Oct 10, 2013 updated at 08:10:03 (UTC)
Goto Top
Zitat von @merben:
Hat vlt was erhalten von Traditionen zu tun^^ ich verstehe es auch nicht so recht warum mein Prof so verpicht drauf ist...
er kann wahrscheinlich keine andere Sprache als Batch, und er will sich wahrscheinlich nicht blamieren wenn einer mit Powershell kommt und er keinen Schimmer davon hat...
nur zum Vergleich wie simpel das mit Powershell ist:
import-csv "c:\csv\test.csv" -Delimiter "," | ?{$_.Pruefen -eq 1} | %{$_.TestNr}  
Member: merben
merben Oct 10, 2013 at 10:26:18 (UTC)
Goto Top
hmm das koennt wohl auch sein! Er ist auch nicht mehr ganz der Juengste :-P


Ein kleines Problemchen habe ich jetzt noch...
Und zwar laeuft er nur bis zu der "Test settings:" Ausgabe. Diese funktioniert wunderbar, sogar schoener als ich mir das vorgestellt hatte face-wink, aber danach passiert nichts mehr. Die Pause direkt danach macht er garnicht... Ich glaube der bricht nach der Ausgabe einfach ab oder?

Danach sollte er eigentlich noch den Test mehrmals durchfuehren bzw. mehrmals die .js oeffnen.

cls
@echo off & setlocal EnableDelayedExpansion

set /a times=1      rem Anzahl durchlaeufe
set /a d=0


	rem read from *.csv

	set "CSVFILE=C:\Users\x0207847\Desktop\test\test.csv"  
	set ACTIVETESTS=
	for /f "usebackq skip=1 delims=" %%a IN ("!CSVFILE!") DO @  
		(
		set "line=%%a"  
		set "line="!line:,=","!""  
		for /f "tokens=1,15 delims=," %%A IN ("!line!") DO @  
			(
			if %%~A == 1 
				(
				if "!ACTIVETESTS!" == ""   
					(
					set ACTIVETESTS=%%~B
					) 
				else 
					(
					set ACTIVETESTS=!ACTIVETESTS!,%%~B
					)
				)
			)
		)
pause 

echo Test settings: !ACTIVETESTS!
pause
 rem send to script
wscript.exe //B //NOLOGO tester.js "!ACTIVETESTS!"  

ECHO Mit Enter den Test starten

FOR /L %%i IN (1,1,%times%) DO       
	(
rem actual Cycle
set /a d=d+1
ECHO Durchlauf

rem Start script
C:\ti\ccs55\ccsv5\ccs_base\scripting\bin\dss.bat tester.js


	)

	ECHO complete
Member: colinardo
colinardo Oct 10, 2013 at 10:40:21 (UTC)
Goto Top
OK der erste Teil bis Zeile 36 deines Scripts ist klar, was danach kommt verstehe ich nicht, warum startest du erneut eine Schleife für das JavaScript ? Wir übergeben doch alle Tests als einen Parameter an das JavaScript. In diesem musst du dann den übergebenen Parameter via Split in ein Array zerlegen und dann für jeden Test eine Subroutine starten...

Auch wenn ich dein vorgehen jetzt nicht verstehe sollte das hier fehlerfrei gehen...
cls
@echo off & setlocal EnableDelayedExpansion

set /a times=1      rem Anzahl durchlaeufe
set /a d=0


	rem read from *.csv

	set "CSVFILE=C:\Users\x0207847\Desktop\test\test.csv"  
	set ACTIVETESTS=
	for /f "usebackq skip=1 delims=" %%a IN ("!CSVFILE!") DO @  
		(
		set "line=%%a"  
		set "line="!line:,=","!""  
		for /f "tokens=1,15 delims=," %%A IN ("!line!") DO @  
			(
			if %%~A == 1 
				(
				if "!ACTIVETESTS!" == ""   
					(
					set ACTIVETESTS=%%~B
					) 
				else 
					(
					set ACTIVETESTS=!ACTIVETESTS!,%%~B
					)
				)
			)
		)
pause 

echo Test settings: !ACTIVETESTS!
pause
 rem send to script
wscript.exe //B //NOLOGO tester.js "!ACTIVETESTS!"  

ECHO Mit Enter den Test starten

FOR /L %%i IN (1,1,!times!) DO       
	(
           rem actual Cycle
           set /a d=!d!+1
           ECHO Durchlauf
           rem Start script
           "C:\ti\ccs55\ccsv5\ccs_base\scripting\bin\dss.bat" tester.js  
	)

echo complete
Member: merben
merben Oct 10, 2013 at 10:43:14 (UTC)
Goto Top
die andere Schleife ist um den Test eine vorgegebene Anzahl durchlaufen zu lassen.
Also wenn er einmal durchgelaufen ist, dass er einfach nochmal aufgerufen wird und erneut laeuft.

Oder macht das so keinen Sinn? face-big-smile


Danke face-smile
Member: colinardo
colinardo Oct 10, 2013 at 10:45:36 (UTC)
Goto Top
Zitat von @merben:
die andere Schleife ist um den Test eine vorgegebene Anzahl durchlaufen zu lassen.
Also wenn er einmal durchgelaufen ist, dass er einfach nochmal aufgerufen wird und erneut laeuft.

Oder macht das so keinen Sinn? face-big-smile
für mich nicht, ich kenn dein JavaScript nicht ....
Member: colinardo
colinardo Oct 10, 2013, updated at Oct 18, 2013 at 10:52:43 (UTC)
Goto Top
Ich meinte das du die einzelnen Tests in deinem Javascript so verarbeitest:
objArgs = WScript.Arguments;
tests = objArgs(0).split(",");  
for (i = 0; i < tests.length; i++)
{
   tuWas(tests[i]);
}

function tuWas(myTest){
	// mach hier was mit dem Test
	WScript.Echo(myTest);
}

Grüße Uwe
Member: merben
merben Oct 10, 2013 at 10:50:39 (UTC)
Goto Top
hmm stimmt das kann man auch eleganter direkt ueber die csv loesen...es steht ja eh nur 1x, 2x oder 5x zur Auswahl
Member: merben
merben Oct 14, 2013 at 08:35:23 (UTC)
Goto Top
Hallo Uwe,
ich habe leider nochmal eine kurze Frage..
Beim ausfuehren des Scripts bekomme ich den Fehler "js: "softreset.js", line 57: uncaught JavaScript runtime exception: ReferenceEr
ror: "WScript" is not defined.


So wie ich jetzt gelesen habe ist das wohl eine Fehlermeldung dass WScript nicht aktiviert ist oder?
Aber wie kann ich das denn aktivieren? Oder muss ich das irgendwie einbinden wie eine Bibliothek?

Schoene Gruesse,
Benjamin
Member: colinardo
colinardo Oct 14, 2013 updated at 08:56:00 (UTC)
Goto Top
Also wenn der Script-Host wirklich deaktiviert ist gehst du folgendermaßen vor um den Windows Scripting Host zu aktivieren

Drücke die Windowstaste + Buchstabe R und gebe regedit ein.
Es öffnet sich der Registrierungseditor.
Folge diesem Pfad:
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows Script Host/Settings
Dort lege die Zeichenfolge Enabled an, indem du mit der rechten Maustaste unter die vorhandenen Werte klickst und im Kontextmenü "Neu/Zeichenfolge" anklickst.
Dann einen Doppelklick darauf und den Wert 1 vergeben. Den Registrierungseditor jetzt schließen und den PC neu starten.
Wenn das nicht reicht setzt du den selben wert auch unter
HKEY_CURRENT_USER/SOFTWARE/Microsoft/Windows Script Host/Settings

Wichtig ist wie bei JavaScript üblich auch GROß und klein-Schreibung d.h. WScript sollte z.b. nicht wscript geschrieben werden ...

Grüße Uwe
Member: merben
merben Oct 14, 2013 at 09:10:28 (UTC)
Goto Top
Guten Morgen,

die Aenderung in der Registry hat leider nichts gebracht... ich habe unter beiden Pfaden das Enabled erstellt und mit einer 1 bewertet...

Hier nochmal die Textzeile aus meinem Script.

	// get Parameters from Batch
	objArgs = WScript.Arguments;
	tests = objArgs(0).split(",")  
	for (i = 0; i < tests.length; i++)
		{
		test_request(tests[i]);
		}
Member: colinardo
colinardo Oct 14, 2013 at 09:16:27 (UTC)
Goto Top
kann ich mir im Moment nicht erklären, denn hier geht es einwandfrei. Welches Betriebssystem verwendest du ? Obige Aktivierung ist für Windows 7 gedacht.
Member: merben
merben Oct 14, 2013 at 09:19:43 (UTC)
Goto Top
Wir haben hier Win7. Kann es vlt irgendwelche Hochschul-Software sein die da Probleme macht? Wenn ja waere das naemlich arg bloed...
Member: colinardo
colinardo Oct 14, 2013 at 09:27:20 (UTC)
Goto Top
Zitat von @merben:
Wir haben hier Win7. Kann es vlt irgendwelche Hochschul-Software sein die da Probleme macht? Wenn ja waere das naemlich arg bloed...
kann ich nicht sagen, ohne das System genauer zu untersuchen... eventuell TeamViewer-Session wenn du möchtest.
hast du mal versucht den Aufruf des Javascripts testweise folgendermaßen zu machen (cscript anstatt wscript):
cscript softreset.js "Argument1,Argument2"
Member: merben
merben Oct 14, 2013 at 09:40:48 (UTC)
Goto Top
TeamView wird hier an der Hochschule wohl etwas schwer face-big-smile An der Registry was zu aendern war eben schon ein grosser Act da ich extra ein Assistent von der Hochschule gebraucht hab^^

Muss ich einfach statt WScript dann CScript schreiben? Muss ich im javascript irgendwo WScript bzw CScript aufrufen oder starten bevor der Befehl aus meinem Snippet kommt?

danke nochmals face-smile
Member: colinardo
colinardo Oct 14, 2013 at 09:44:55 (UTC)
Goto Top
Zitat von @merben:
Muss ich einfach statt WScript dann CScript schreiben? Muss ich im javascript irgendwo WScript bzw CScript aufrufen oder starten
bevor der Befehl aus meinem Snippet kommt?
du startest das Script nur mit dem Kommandozeileninterpreter 'cscript.exe' in der Batch. An deinem Code im JavaScript musst du nichts ändern.
Ansonsten pobier das ganze dann mal Zuhause aus, wenn es da geht, kannst du dich bei deinem Prof. beschweren ...face-smile
Member: merben
merben Oct 14, 2013 at 11:02:23 (UTC)
Goto Top
nachdem ich es jetzt endlich geschafft habe das CScript zu aktivieren(muss man erstmal wissen dass man die Command Prompt als Admin ausfuehren muss um das zu aendern^^) habe ich leider immernoch die gleichen fehler...

So langsam verzweifel ich noch an dem Problem face-big-smile

Hier mal noch kurz die Ausgabe:

Following tests will be executed: 5x,Soft reset before
Press any key to continue . . .
Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation. All rights reserved.

The default script host is now set to "cscript.exe".
js: "softreset.js", line 508: uncaught JavaScript runtime exception: ReferenceEr
ror: "CScript" is not defined.
Member: colinardo
colinardo Oct 14, 2013 at 11:08:35 (UTC)
Goto Top
da ist noch irgendein Fehler bei dir drin den ich nicht sehen kann, wenn er bei Zeile 508 auftritt sehe ich eine ganze Menge aus deinem Script nicht !!
Sieht so aus als hättest du auch im Code das WScript in CScript geändert, aber das darfst du nicht, hatte ich ja oben schon geschrieben !
probiers erst mal Zuhause bevor wir hier weitermachen, denn bei mir geht es wie gesagt einwandfrei auf 3 Systemen.
Member: merben
merben Oct 18, 2013 updated at 10:51:44 (UTC)
Goto Top
sorry ich konnte irgendwann das programm nicht mehr sehen und hab mich so lang auf was anderes konzentriert^^

Bei mir daheim ging es dann mit dem WScript!!

Jetzt habe ich aber gleich bei der naechsten Zeile ein Problem....


		tests = objArgs(0).split(",")  
		for (i = 0; i < tests.length; i++)
			{
			test_request(tests[i]);
			}

bei dem Teil bringt er js: " uncaught JavaScript runtime exception: TypeError: Cannot find function split.

Die anderen Zeilen des Programms sind eigentlich nur abfragen die erst im spaeteren Teil gebraucht werden. Eigentlich eine riessige if else Schleife.

Als Packages habe ich folgende wobei die ersten 5 softwarespezifisch fuer die controller programmierung sind:
importPackage(Packages.com.ti.debug.engine.scripting)
importPackage(Packages.com.ti.debug.engine.scripting.events)
importPackage(Packages.com.ti.debug.engine.scripting.events.internal)
importPackage(Packages.com.ti.debug.engine.scripting.setup)
importPackage(Packages.com.ti.ccstudio.scripting.environment)
importPackage(Packages.java.lang)


Beim starten der Batch bekomme ich auch folgenden Fehler:

Script:
C:\ Pfad zur .js

Line:2 // das ist die Zeile mit importPackage(Packages.com.ti.debug.engine.scripting)
Char:1
Error: 'Packages' is undefined
Code: 800A1391
Source: Microsoft JScript runtime error
Member: colinardo
colinardo Oct 18, 2013 at 10:55:54 (UTC)
Goto Top
mit welchem Tool hast du das JavaScript denn vorher ausgeführt ? Jede Umgebung (hier der Windows Script Host -> wscript) stellt andere Funktionen und Objekte bereit, deswegen kommen die ganzen Fehler !
Grüße Uwe
Member: merben
merben Oct 22, 2013 at 13:55:38 (UTC)
Goto Top
puhh ich habs endlich! Das Problem war dass der Parameter kein string war....ich hab jetzt einen typecast gemacht und jetzt bekomme ich es ausgelesen face-wink