Javascript 2D-Array in Datei schreiben

Gast #7193773
Lesenswert?

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?
#7193859
Lesenswert?

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.
Gast #7194161
Lesenswert?

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
Gast #7194433
Lesenswert?

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?
Gast #7194446
Lesenswert?

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.
#7194520
Lesenswert?

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:
1
"Tabellen Header ""#0""";"Tabellen Header ""#1""";"Tabellen Header ""#2""";"Tabellen Header ""#3""";"Tabellen Header ""#4"""
2
7,284;37,861;13,437;28,291;4,489
3
36,652;31,336;6,168;10,499;36,208
4
13,954;17,547;31,998;23,876;33,184
5
11,29;33,808;6,488;31,784;30,334
6
24,087;11,784;31,328;31,083;40,305
7
7,137;37,035;24,28;26,971;0,496
8
7,837;21;33,669;0,794;26,81
9
16,405;29,972;15,09;37,306;9,814
10
22,644;32,017;14,383;20,967;21,364
11
18,397;13,794;22,876;39,664;9,168

und wird von Libreoffice anstandslos eingelesen, Screenshot.
Angehängte Dateien:
#7196598
Lesenswert?

jswriter schrieb:
> const zeile=csvda.map(col=>col[h]);

ist die Kurzform von
1
csvda.map((col)=>{ return col[h]});
was wiederum funktioniell (in diesem Fall) identisch ist mit:
1
csvda.map(function(column) { return column[h]; });

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.
Angehängte Dateien:
#7196812
Lesenswert?

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?
Gast #7196837
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren