Hallo, ich habe bei JS aktuell ein Problem. Es soll ein 2D-Array in eine
Datei so geschrieben werden, dass tabellarisch 300 Werte in 5 Spalten
untereinander aufgelistet werden.
1
2
var array1 = new Array(5);
3
4
for (var g = 0; g < array1.length; g++) {
5
array1[g] = new Array(301);
6
}
Die erste Zeile der Tabelle enthält Text und ab der zweiten Zeile sollen
dann nur noch Werte stehen.
Also die Array-Einträge für die erste Zeile lauten:
1
2
array1[0][0] ="Text1";
3
array1[1][0] ="Text2";
4
array1[2][0] ="Text3";
5
array1[3][0] ="Text4";
6
array1[4][0] ="Text5";
Alle anderen Array-Einträge werden wie gesagt mit Zahlen gefüllt (was
auch korrekt passiert).
Nun verarbeite ich das Array wie folgt für die Datei:
1
2
len = array1[0].length;
3
4
for(col = 0; col < len; col++){
5
var line = "" + array1[0][col]+";"+ array1[1][col]+";"+ array1[2][col]+";"+ array1[3][col]+";"+ array1[4][col]+";";
6
writeLine(line,true);
7
}
8
function writeLine(line, replacePoint) {
9
var len = line.length();
10
// out.println("Len: " + len + " str: " + line);
11
// out.println(zeile);
12
datei = new java.io.FileOutputStream(pathnameErgebnis, true);
13
for ( var index = 0; index < len; index++) {
14
var cha = line.charCodeAt(index);
15
if (replacePoint)
16
if (cha == 46) // Punkt mit Komma ersetzen
17
cha = 44;
18
datei.write(cha);
19
}
20
// file.write(10);
21
datei.write(13);
22
datei.close();
23
// out.println(line);
24
}
Mein Problem ist, dass fast alle Einträge der Datei mit "undefined"
ausgegeben werden, es gibt aber einige Ausnahmen z.B. stehen in der
letzten Zeile korrekte Wert.
Was ist da das Problem?
statt einen CSV-Writer neu zu erfinden, könntest du auch einfach ein
fertiges NPM-Modul dafür verwenden. Das handhabt dann auch escaping,
Zeilenenden usw. richtig.
jswriter schrieb:> Hast du da ein fertiges Beispiel?
Nein. Dein Eingangspost lässt bei mir zuviele Troll-Alarmglocken
klingeln, als dass ich da Zeit in ein Beispiel investieren würde.
Falls kein Troll, und dein Code Resultat von wildem Copy&Paste aus den
ältesten und schlechtesten Codebeispielen im Internet ist:
Mein Beileid, aber lerne erstmal ein paar Sprachgrundlagen. Am besten
nicht aus einem 15 Jahre alten Lehrbuch oder Tutorial.
Nein, es ist kein Troll, ich habe mich mit solchen Anwednungen bisher
nicht beschäftigt, bin Regelungstechniker und weiß, wie ich mit JS die
Sensoren aufnehmen kann und meinen Output rausschicken kann und dachte
hier könnte mir jemand helefen
jswriter schrieb:> Nein, es ist kein Troll, ich habe mich mit solchen Anwednungen bisher> nicht beschäftigt, bin Regelungstechniker
Nun, für deinen Beruf musstest du den Umgang mit den einschlägigen
Werkzeugen erlernen. Was läßt dich glauben, dass es beim Programmieren
anders sein könnte?
c-hater schrieb:> jswriter schrieb:>>> Nein, es ist kein Troll, ich habe mich mit solchen Anwednungen bisher>> nicht beschäftigt, bin Regelungstechniker>> Nun, für deinen Beruf musstest du den Umgang mit den einschlägigen> Werkzeugen erlernen. Was läßt dich glauben, dass es beim Programmieren> anders sein könnte?
Aber er will doch lernen, deshalb fragt er hier nach Details.
Er kann ja schlecht nochmals in die JS-Gruppe des örtlichen
Kindergartens gehen.
Leider kann ich kaum JS, und kann die Frage nicht beantworten.
jswriter schrieb:> Nein, es ist kein Troll,
Will ich dir mal glauben, hier ein Beispiel:
1
const DEBUG=false;
2
3
// Werte vorbereiten
4
const tabelle=Array();
5
for (let i=0; i<5; ++i) {
6
const spalte=Array();
7
spalte.push(`Tabellen Header "#${i}"`);
8
for (let j=0; j<10; ++j) {
9
spalte.push((Math.random()*42));
10
}
11
tabelle.push(spalte);
12
}
13
14
// Kontrollausgabe
15
if (DEBUG) console.table(tabelle);
16
17
// Hilfsfunktion: Einzelne Zelle -> CSV
18
function formatCell(value) {
19
if (typeof value == "number") {
20
// Abhängig von Systemeinstellungen:
21
// Automatisch mit Punkt oder Komma als Dezimaltrenner
22
return value.toLocaleString();
23
} else {
24
// alles andere mit '"' einfassen.
25
// Sonderfall '"' im Text wird als '""' in's CSV geschrieben.
26
return `"${value.replace(/"/g,'""')}"`;
27
}
28
}
29
30
for (let i=0; i<tabelle[0].length; ++i) {
31
// Eine Zeile aus der Tabelle holen
32
const zeile=tabelle.map(col=>col[i]);
33
// Kontrollausgabe
34
if (DEBUG) console.table(zeile);
35
// in CSV wandeln
36
const csvZeile=zeile.map(formatCell).join(';');
37
// Kontrollausgabe
38
console.log(csvZeile);
39
// Zeile in Datei schieben:
40
// TODO
41
}
Ist (bis auf console.*) pures Javascript, ohne irgendwelche externen
Dependencies.
Schreiben in die Datei musst du selber ergänzen.
Diverse DEBUG-Ausgaben sind eingebaut, damit du dir Zwischenergebnisse
anschauen kannst, falls dir ein Schritt nicht klar ist.
Ausgabe schaut dann so aus:
Wenn dein Javascript-Interpreter das nicht kann, ist der sicher einige
Jahre veraltet.
jswriter schrieb:> return `"${value.replace(/"/g,'""')}"`;
Hätte man früher™ so geschrieben:
return '"'+value.replace(/"/g,'""')+'"';
Auch das gibt's schon Ewig.
Und wenn dein JS noch nicht mal const/let statt var nimmt, ist der
vermutlich noch kein Ecmascript 6...
Es gibt Transpiler (babel & co), um aktuelles Javascript in die
prähistorischen Versionen zu übersetzen.
https://babeljs.io/repl/
Resultat im Anhang.
jswriter schrieb:> Diesen return akzeptiert er immer noch nicht
Welchen?
Aber, lass mich raten: Du hast garkein Javascript, sondern irgendein
"Eclipse-basiertes" Geheimprojekt, in das jemand vor vielen Jahren mal
einen selbstgefrickelten Script-Interpreter reingebastelt hat.
Derjenige hat sich damals grob von Javascript inspirieren lassen, hat
aber die Firma schon lange verlassen, und es ist keine Dokumentation
übrig.
Soweit korrekt?
return '"'+value.replace(/"/g,'""')+'"';
akzep´tiert er nicht. Ich habe jetzt einfach mal return '"'+value+'"';
draus gemacht. Jetz läuft er zumindest schon mal durch, aber es müssen
erst 300 Daten aufgenommen werden, somit kann ich erst später was dazu
sagen
Mein Beruf ist übrigens u.a. das Aufnehmen und verarbeiten von
Sensordaten, hardwarenah und mit elementaren mathematischen Operatoren.
Das hat bisher auch ganz gut funktioniert..