Forum: PC-Programmierung Javascript 2D-Array in Datei schreiben


von jswriter (Gast)


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?

von Εrnst B. (ernst)


Lesenswert?

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.

von jswriter (Gast)


Lesenswert?

kann ich nichts mit anfangen. Hast du da ein fertiges Beispiel?

von Εrnst B. (ernst)


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.

von jswriter (Gast)


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

von c-hater (Gast)


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?

von PittyJ (Gast)


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.

von Εrnst B. (ernst)


Angehängte Dateien:

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.

von jswriter (Gast)


Lesenswert?

ok vielen Dank trotz des ersten frechen Kommentars

von Herbert B. (Gast)


Lesenswert?

Wechsel doch zu Pförtner wenn du schon an sowas Trivialem scheiterst. Du 
hast 100% den Beruf verfehlt.

von jswriter (Gast)


Lesenswert?

Halt deinen Mund, du hast keine Ahnung

von jswriter (Gast)


Lesenswert?

1
const zeile=csvda.map(col=>col[h]);

Aus irgendeinem Grund will er diesen Code-Teil nicht akzeptieren, keine 
Ahnung warum

von sieste (Gast)


Lesenswert?

Dann doch lieber Pförtner

von jswriter (Gast)


Lesenswert?

wenn ich das const in var umwandle, geht es.. allerdings meckert er dann 
hier:
1
 return `"${value.replace(/"/g,'""')}"`;

von Εrnst B. (ernst)


Angehängte Dateien:

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.

: Bearbeitet durch User
von jswriter (Gast)


Lesenswert?

Diesen return akzeptiert er immer noch nicht, weder die erste Version 
aus deinem Text, noch das Resultat aus dem Anhang

von Εrnst B. (ernst)


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?

von jswriter (Gast)


Lesenswert?

ja, so ungefähr^^

von jswriter (Gast)


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

von Herbert B. (Gast)


Lesenswert?

Mein Gott was für ein endloses und erbärmliches Gemurkse für so einen 
Kinderkram. Fahr Pizza aus, das ist einfacher.

von jswriter (Gast)


Lesenswert?

wenn es nicht geht, kann es ja scheinbar nicht ganz so offensichtlich 
sein

von jswriter (Gast)


Lesenswert?

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..

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.