# csv zu einer HTML Tabelle und ein Diagramm



## kosovafan (16. Oktober 2016)

Hallo, 

ich habe verschiedene CSV Files die als HTML Tabelle wiedergegeben werden, zurzeit macht das ein Jquery Addon das aber für jedes html file das csv File übergeben werden muss. Das ist logisch, aber ich frage mich ob es nicht eine Möglichkeit gibt das csv File aus den Link zu ziehen. Zum Beispiel.  


```
CsvToHtmlTable.init({
csv_path: 'csv/machinery.csv',
element: 'table-container',
allow_download: false,
csv_options: {separator: ','},
datatables_options: {"paging": false}
});
```

Mit 30 csv Files ist das ein wenig Arbeit insbesondere weil ich wegen der einfachen Pflege gerne zu Middleman konvertieren möchte. Hier wird ja mehr oder weniger mit Templates gearbeitet. 

Zweite Frage wäre ob ein Addon für Jquery bekannt ist der Rechnen könnte und Daten als Diagramme darstellen könnte? Ich habe zwar ein paar Mathe Addons gefunden aber die wirken irgendwie ein wenig zu overload. 

Berechnet werden sollen die Daten aus den entsprechenden CSV Feldern und in der HTML Tabelle eingetragen werden. Es wäre zwar super wenn das auch mit mehreren Files funktionieren könnte, aber das ist glaube ich mit JavaScript nicht möglich. 

Wäre über Tips, Links und Infos dankbar. 

Danke / Schönen Tag
Silvio


----------



## Sempervivum (16. Oktober 2016)

> zurzeit macht das ein Jquery Addon das aber für jedes html file das csv File übergeben werden muss. Das ist logisch, aber ich frage mich ob es nicht eine Möglichkeit gibt das csv File aus den Link zu ziehen.


Bin mir nicht ganz sicher, wie Du das meinst, aber wäre es eine Möglichkeit, die CSV-Datei als URL-Parameter zu übergeben: http://domain.de/pfad/datei.html&csv-file=data/machinery.csv? Das kann man dann mit Javascript heraus ziehen und an CsvToHtmlTable.init() übergeben. Dann würdest Du nur noch eine HTML-Datei brauchen.



> Zweite Frage wäre ob ein Addon für Jquery bekannt ist der Rechnen könnte und Daten als Diagramme darstellen könnte? Ich habe zwar ein paar Mathe Addons gefunden aber die wirken irgendwie ein wenig zu overload.


Auch hier weiß ich nicht genau, was Du dir vorstellst. Ein Plugin, das Charts darstellen kann, so wie sie hier aufgelistet sind?:
https://www.sitepoint.com/15-best-javascript-charting-libraries/


----------



## kosovafan (16. Oktober 2016)

> http://domain.de/pfad/datei.html&csv-file=data/machinery.csv? Das kann man dann mit Javascript heraus ziehen und an CsvToHtmlTable.init() übergeben. Dann würdest Du nur noch eine HTML-Datei brauchen.



wenn der link zum Beispiel meinlink.com/section/farming.html ist, wäre es nicht möglich mit JavaScript den Link zu lesen und alles vor farming und die extension zu löschen und das dann als csv in die entsprechende Zeile eintragen? Das wäre sicher nicht so performant, aber für interne Seiten reicht das sicher aus. 



> Auch hier weiß ich nicht genau, was Du dir vorstellst. Ein Plugin, das Charts darstellen kann, so wie sie hier aufgelistet sind?:
> https://www.sitepoint.com/15-best-javascript-charting-libraries/




```
Year,ZA,NA,BW,MG,ZW,AO,ZM,KE,NG,CF,GH,CM,CD,ET,UG,EG,DZ,MA,MR,NE,SD,TN,SO
2000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2001,36,14,11,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2002,43,14,13,0,0,21,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
```

Das ist das CSV File, naja leicht verkürzt. Es geht bis 2016. Wenn ich die ganzen Addons richtig verstehe muss man die Daten vorgeben. Aber gibt es auch eine Möglichkeit das man mit JavaScript die jeweiligen Zeilen des Jahren zusammenrechnet und das Ergebnis dann in das Diagramm einträgt. 


Jahr 2000 > 0 > Diagramm 2000 0
Jahr 2001 > 75 > Diagramm 2001 74
Jahr 2002 > 106 > Diagramm 2002 106

Das praktisch gerechnet und in das Diagramm eingesetzt werden kann. Wenn das nicht geht, wäre ja okay dann rechne ich das mit CSV zusammen und dann soll JavaScript für das Diagramm die Spalten und Zeilen Gesamt + Jahr darstellen. 

Danke / Schönen Abend
Silvio


----------



## Sempervivum (16. Oktober 2016)

> wenn der link zum Beispiel meinlink.com/section/farming.html ist, wäre es nicht möglich mit JavaScript den Link zu lesen und alles vor farming und die extension zu löschen und das dann als csv in die entsprechende Zeile eintragen?


Ach so, Du möchtest für die CSV-Datei den selben Namen und nur die andere Erweiterung verwenden. Das ist selbstverständlich möglich, z. B. so wie hier beschrieben:
http://befused.com/javascript/get-filename-url

```
var url = window.location.pathname;
var csvfilename = url.substring(url.lastIndexOf('/')+1).replace(/\.html$/, ".csv");
```



> Aber gibt es auch eine Möglichkeit das man mit JavaScript die jeweiligen Zeilen des Jahren zusammenrechnet und das Ergebnis dann in das Diagramm einträgt.





> Das praktisch gerechnet und in das Diagramm eingesetzt werden kann. Wenn das nicht geht, wäre ja okay dann rechne ich das mit CSV zusammen und dann soll JavaScript für das Diagramm die Spalten und Zeilen Gesamt + Jahr darstellen.


Auch das sollte kein Problem sein. Offenbar gibt es Plugins mit denen man einen CSV-String bzw. eine CSV-Datei parsen kann:
http://stackoverflow.com/questions/1293147/javascript-code-to-parse-csv-data
Hat man die Daten erst Mal in einer Javascript-Struktur, kann man beliebige Berechnungen damit anstellen, natürlich auch die, die Du beschreibst.


----------



## kosovafan (16. Oktober 2016)

Danke,

werde ich mal versuchen. Würde vieles erleichtern. Ich hatte zwar mit PHP ein wenig probiert, aber meine Pferde haben sich schon über den Krach beschwert und der Hund dachte ich habe Besuch. 

Danke / Schönen Abend
Silvio


----------



## Sempervivum (16. Oktober 2016)

Viel Erfolg! Und wenn Du an einer Stelle nicht weiter kommst, kannst Du dich ja wieder melden. Interessante Aufgabe.


----------



## kosovafan (17. Oktober 2016)

Sempervivum hat gesagt.:


> Viel Erfolg! Und wenn Du an einer Stelle nicht weiter kommst, kannst Du dich ja wieder melden. Interessante Aufgabe.



Das werde ich bestimmt machen. Interessant, ich habe irgendwie Panik. Ich und mein Mundwerk. Ja mache ich kein Problem. Jetzt wird das Ausmaß einen erstmal bewusst. 

Gruß / Schönen Abend
Silvio


----------



## kosovafan (18. Oktober 2016)

Hallo,

kurzes Update:
Zum auslesen der CSV Dateien nutze ich jetzt CSV-To-HTML-Table was zu arbeiten scheint. Es sind sicher noch Feinarbeiten notwendig aber zur Zeit macht es seinen Job:


```
var url = window.location.pathname; 
var csvfilename = url.substring(url.lastIndexOf('/')+1).replace(/\.html$/, ".csv");
var filename = "csv/" + csvfilename;

CsvToHtmlTable.init ({
csv_path: filename,
element: 'table-container',
allow_download: false,
csv_options: {separator: ','}
datatables_options: {"paging": false}
```

Die Diagramme erstelle ich mit Dygraphs, leider habe ich keine Möglichkeiten gefunden das aus der gleichen Datei zu extrahieren, also eine weitere csv Datei angelegt die diese Daten vorhält. Das entsprechende Script findet sich im Anhang als txt Datei, vielleicht für den ein oder anderen Anfänger wie ich ebenfalls interessant.  

Danke & Schönen Abend
Silvio


----------



## Sempervivum (18. Oktober 2016)

> leider habe ich keine Möglichkeiten gefunden das aus der gleichen Datei zu extrahieren, also eine weitere csv Datei angelegt die diese Daten vorhält.


Woran ist es denn gescheitert? Ich bin eigentlich optimistisch, dass es eine Möglichkeit gibt, die erste CSV-Datei zu konvertieren, so dass sie als Basis für die Grafik dienen kann. Betrifft das die Berechnungen, von denen Du gesprochen hast, wo eine Summe über eine Anzahl von Zellen gebildet werden muss?
Edit: Ich habe mal einen kurzen Blick auf dygraphs geworfen und offenbar ist es so, dass die Quelle für das Diagramm auch ein String im CSV-Format sein kann. Den könnte man problemlos mit Javascript aufbauen. Alternativ serverseitig mit PHP die erste in die zweite CSV-Datei konvertieren.


----------



## kosovafan (18. Oktober 2016)

> Woran ist es denn gescheitert? Ich bin eigentlich optimistisch, dass es eine Möglichkeit gibt, die erste CSV-Datei zu konvertieren



Mit Dygraphs habe ich keine Option gefunden die sagt Spalte 1 = Y + Spalte 25 = X, nur mit der Option visibility kann man das Diagramm einschränken was nicht funktioniert hat. Die letzte Spalte hat irgendwie nicht existiert.




> Den könnte man problemlos mit Javascript aufbauen. Alternativ serverseitig mit PHP die erste in die zweite CSV-Datei konvertieren.



Ich bin kein Profi. Ich mache nichts anderes als im Internet vorhandenes zu suchen und für mich anzupassen und ja ich weiß man kann Leute beauftragen aber unsere Gelder als Stiftung liegen nicht auf der Straße. Wir wollten auf PHP verzichten, rein HTML + Javascript. Das mindert die Wartung. Man Power ist nicht einfach zu finden und schon gar nicht mit Leidenschaft und Herz für die Sache wie für unsere Sache.

Ich blicke bei Dygraphs noch nicht wirklich ganz durch, wenn man mit Javascript die Spalten A + Y glaube ich war es extrahieren könnte und jeweils als X / Y Axe angeben kann wäre das sicher hilfreich, aber immer fragen ist irgendwie auch beschämend. Ich habe auch noch keine Option gefunden wie man Einfluss auf die Abmessungen der Grafik nehmen kann.

Ich überlege ob ich die Tabellen nicht doch statistisch ausschreibe und nur für statistische Zwecke grafisch aufarbeite. Aber sicher bin ich mir noch nicht, Dateien aus 16 Jahren mit einer Menge an Daten sind auch sehr zeit intensive. Im Computer Zeitalter finde ich das auch deprimierend. 

CSV to Markdown Table wäre interessant, oder wenn ich Middleman zur Mitarbeit überreden kann. Wie ich im Internet fand gibt es Möglichkeiten mit Ruby. Es scheint eine sehr elegante Sprache zu sein, zumindest wenn ich mir den Middleman Code so anschaue.


Danke / Schönen Abend
Silvio


----------



## Sempervivum (18. Oktober 2016)

> Mit Dygraphs habe ich keine Option gefunden die sagt Spalte 1 = Y + Spalte 25 = X, nur mit der Option visibility kann man das Diagramm einschränken was nicht funktioniert hat. Die letzte Spalte hat irgendwie nicht existiert.


Wenn es nicht mit Dygraphs geht, dann mit Sicherheit, indem man die CSV-Datei parst und konvertiert. Poste doch mal ein paar Beispielzeilen.


----------



## kosovafan (18. Oktober 2016)

Hallo, 


```
Year,ZA,NA,BW,MG,ZW,AO,ZM,KE,NG,CF,GH,CM,CD,ET,UG,EG,DZ,MA,MR,NE,SD,TN,SO,All
2000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2003,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10
2004,12,6,6,0,8,8,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46
2005,13,6,7,0,9,8,7,3,3,3,6,5,7,5,5,3,1,0,0,0,0,0,0,91
2006,17,9,10,0,11,8,7,3,3,3,6,7,8,9,7,4,1,3,1,3,0,0,0,121
2007,19,9,10,0,10,7,9,3,3,6,6,11,12,11,9,5,3,5,1,6,1,3,3,151
2008,24,9,11,0,12,10,10,3,6,6,7,14,15,17,11,6,3,7,1,6,3,4,4,190
2009,26,12,13,0,13,14,12,6,6,6,7,13,18,14,19,7,4,8,2,7,3,6,6,221
2010,29,12,16,0,14,16,16,6,6,6,8,15,21,20,20,7,6,9,2,11,4,7,7,257
2011,35,12,20,0,16,17,16,6,6,9,8,18,23,25,25,8,7,16,2,12,4,8,10,304
2012,39,15,19,0,17,16,17,6,9,9,9,20,26,28,28,9,8,20,3,13,6,9,12,339
2013,38,15,24,0,19,18,20,6,9,9,10,24,27,30,31,10,8,23,3,16,6,13,14,372
2014,43,15,26,0,20,20,19,9,9,9,12,26,30,37,35,11,9,24,3,19,7,19,15,418
2015,49,17,30,0,21,21,20,9,12,10,15,26,31,45,37,13,11,27,3,23,16,24,20,480
2016,53,23,39,0,28,26,20,9,12,10,17,29,34,49,40,15,11,31,4,27,16,32,21,547
```

Das ist ein Beispiel. Wie gesagt ich brauche für die grafische Aufarbeitung nur das Jahr und All. 

Danke | Schönen Abend
Silvio


----------



## Sempervivum (18. Oktober 2016)

Ich habe mal etwas aufgebaut: Parsen und Konvertieren dieser CSV-Datei, Anzeige als Grafik mit dem Code aus deiner Textdatei:

```
<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <meta name="author" content="Claus">
        <meta name="editor" content="html-editor phase 5">
        <link rel="stylesheet" href="css/font-awesome-4.6.3/css/font-awesome.min.css">
        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
        <script type="text/javascript" src="js/papaparse.min.js"></script>
        <script type="text/javascript" src="js/dygraph-combined.js"></script>
    </head>
    <body>
        <div id="graphdiv"></div>
        <script>
            // draw chart for employee
            // Darken a color
            function darkenColor(colorStr) {
            // Defined in dygraph-utils.js
            var color = Dygraph.toRGB_(colorStr);
                color.r = Math.floor((255 + color.r) / 2);
                color.g = Math.floor((255 + color.g) / 2);
                color.b = Math.floor((255 + color.b) / 2);
                return 'rgb(' + color.r + ',' + color.g + ',' + color.b + ')';
            }

            // This function draws bars for a single series. See
            // multiColumnBarPlotter below for a plotter which can draw multi-series
            // bar charts.
            function barChartPlotter(e) {
                var ctx = e.drawingContext;
                var points = e.points;
                var y_bottom = e.dygraph.toDomYCoord(0);

                ctx.fillStyle = darkenColor(e.color);

                // Find the minimum separation between x-values.
                // This determines the bar width.
                var min_sep = Infinity;
                for (var i = 1; i < points.length; i++) {
                  var sep = points[i].canvasx - points[i - 1].canvasx;
                  if (sep < min_sep) min_sep = sep;
                }
                var bar_width = Math.floor(2.0 / 3 * min_sep);

                // Do the actual plotting.
                for (var i = 0; i < points.length; i++) {
                  var p = points[i];
                  var center_x = p.canvasx;

                  ctx.fillRect(center_x - bar_width / 2, p.canvasy,
                      bar_width, y_bottom - p.canvasy);

                  ctx.strokeRect(center_x - bar_width / 2, p.canvasy,
                      bar_width, y_bottom - p.canvasy);
                }
            }
            var url = window.location.pathname;
            var csvfilename = url.substring(url.lastIndexOf('/') + 1).replace(/\.html$/, ".csv");
            var filename = "csv/" + csvfilename;
            Papa.parse(filename, {
                delimiter: ",",
                download: true,
                complete: function (data) {
                    var indata = data.data;
                    var outdata = [];
                    for (var i = 1; i < indata.length; i++) outdata.push([indata[i][0], indata[i][24]])
                    var g = new Dygraph(
                        document.getElementById("graphdiv"),
                        outdata,
                        {
                            animatedZooms: true,
                            plotter: barChartPlotter,
                            title: 'Employee',
                            valueRange: [0, 550]
                        }
                    );
                }
            });
        </script>
    </body>
</html>
```


----------



## kosovafan (18. Oktober 2016)

Okay vielen Dank. Das werde ich morgen probieren und berichten. Jetzt ist Zeit für das Entspannen. 

Danke & Schönen Abend
Silvio


----------

