InternInhaltsverzeichnisGlossarBausteineLinklisteTutorialsKommentare

Thema: CSV-Datei einlesen und dynamisch als HTML-Tabelle ausgeben Artikel anzeigen

Werner schrieb am Sonntag, den 21 März 2021 #21
Hallo Burim,
das funktioniert nicht über http / https. Es muss ein lokaler Dateipfad angegeben werden
Burim ✶✶✶✶✶ schrieb am Sonntag, den 21 März 2021 #22
Hallo Werner, mit einem lokalen Ordner funktioniert alles, nur wollte ich das Script auf mehrere Webseiten installieren und auf einem entfernten Ordner die CSV-Datei abrufen.Um die CSV-Datei nicht auf mehrere Webseiten zu uploaden habe ich mir gedacht die CSV-Datei auf einen Server zu installieren und die Datei nur dort zu aktualisieren. Gibt es da nicht eine PHP-Lösung für entfernte Pfade?
Werner schrieb am Montag, den 22 März 2021 #23
Für entfernte Pfade kenne ich nur: file_get_contents() - php.net/manual/de/func[…]t-contents

Allerdings wird die Datei nicht als Array eingelesen, sondern als String (Zeichenkette).
Die Formatierung müsstest du dann selbst durchführen.
Das heist, zuerst die einzelnen Zeilen in ein Array konvertieren (mit explode()) und dann über eine foreach-Schleife auslesen. » werner-zenk.de/php/csv-datei_auslesen.php
Peter schrieb am Dienstag, den 23 März 2021 #24
Muss es eine CSV Datei sein?
Am einfachsten wäre extern eine XML Datei zu erstellen und dann per simplexml_load_file einzubinden und diese mit PHP auslesen - bei mehreren Attributen natürlich mit foreach.
Werner schrieb am Donnerstag, den 1 April 2021 #25
Hallo Burim,
ein Script das dir vielleicht helfen könnte:
1
2
3
4
5
6
7
8
9
10
11
<?php
$file 
file_get_contents('http://www.example.com/data.csv');
$daten explode("\n"$file); // Eventuell \r\n

foreach ($daten as $nr => $data) {
 if (
$nr 0) {
  list(
$spalte1$spalte2$spalte3) = explode(";"$data); // ; Trennzeichen
  
echo $spalte1 ' - ' $spalte2 '<br>';
 }
}
?>
Burim ✶✶✶✶✶ schrieb am Freitag, den 16 April 2021 #26
Hallo Werner,

hab das jetzt so gelöst, die CSV-Datei wird auf einem anderen Server gelesen (https://www.halili.de/bankdaten/Kauf.csv) und dann abgespeichert auf (bankdaten/Kauf.csv).

Diesen Beitrag vollständig anzeigen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
<?php
/*
 * CSV-Datei einlesen und dynamisch als Tabelle ausgeben
 */
 
// csv-datei von einem anderen Server laden und abspeichern
$extern_url "https://www.halili.de/bankdaten/Kauf.csv";
$local_file "bankdaten/Kauf.csv";
$fpread = @fopen($extern_url'r');
if(!
$fpread)
{
echo 
"Zur Zeit nicht erreichbar<br>n";
#exit;
} else {
$fpwrite = @fopen($local_file'w');
if(!
$fpwrite)
{
echo 
"$errstr ($errno)<br>";
exit;
} else {
while(! 
feof($fpread) )
{
$buffer = @ltrim(Chop(fgets($fpread256))).""//Zwischen Anführungszeichen war ein n, habe ich gelöscht
fputs($fpwrite$buffer);
}
@
fclose($fpread);
}
@
fclose($fpwrite);
}


$verzeichnis "bankdaten/"// Verzeichnis der Daten
$dateiendung "csv"// Dateiendung
$trenner "|"// Trennzeichen

// Liste ausgeben
if (isset($_GET["liste"])) {

 
// Verzeichnis auslesen und ausgeben
 
foreach (array_slice(scanDir($verzeichnis), 2) as $datei) {
  
$path pathinfo($datei);
  if (
$path["extension"] == $dateiendung) {
   
$arr[] = ['datei'=>$datei];
  }
 }
 echo 
json_encode($arr);
 exit;
}

// Tabelle
if (isset($_GET["ausgeben"])) {

 
// Tabellenkopf - Beschriftung
 
$tabellenSpalten = [
  
'Nettodarlehensbetrag',
  
'Zinsbindung',
  
'Sollzins - Effektivzins',
  
'Stand',
  
'Link',
 ];

 
// Tabellenkopf erstellen
 
$ausgabe '<table id="table"><tr>';
 foreach (
$tabellenSpalten as $spalte) {
  
$ausgabe .= '<th>' $spalte '</th>';
 }
 
$ausgabe .= '</tr>';

 
// Datei auslesen
 
$datensaetze file($verzeichnis $_GET["ausgeben"]);
 foreach (
$datensaetze as $datensatz) {

  
// PHP-Variablen - Bitte nach Anzahl der Spalten anpassen!
  
list( $s[1], $s[2], $s[3], $s[4], $s[5],
   ) = 
explode($trenner$datensatz);

  
// Tabellenzeilen erstellen
  
$ausgabe .= '<tr>';
  for (
$i 1$i <= count($tabellenSpalten); $i++) {
   
$ausgabe .= '<td>' $s[$i] . '</td>';
  }
  
$ausgabe .= '</tr>';
 }

 echo 
$ausgabe '</table>';
 exit;
}
?>
<!DOCTYPE html>
<html lang="de">
 <head>
  <meta charset="UTF-8">
  <title> CSV-Datei einlesen und dynamisch als Tabelle ausgeben</title>

  <script>
  // Das XMLHttpRequest-Objekt setzen
  var xhr = new XMLHttpRequest();

  // Beim laden der Seite diese Funktion aufrufen
  window.addEventListener('DOMContentLoaded', function() {

    // Eine Anfrage über GET senden
    xhr.open("GET", document.URL + "?liste");
    xhr.send(null);

    // Auf eine Antwort warten
    xhr.onreadystatechange = function () {
     if (xhr.readyState == 4 && xhr.status == 200) {

      // Die erhaltenen Daten in einzelne Objekte zerlegen (JSON)
      var obj = JSON.parse(xhr.responseText);

      // Neue Elemente in die Auswahlliste einfügen
      for (var counter = 0; counter < obj.length; counter++) {
       document.getElementById("selection").options[counter] = new Option(obj[counter].datei, obj[counter].datei);
      }

      // Dem HTML-Button (name="anzeigen") den Event: "click" zuweisen
      // Dieser ruft dann die Funktion: ladeTabelle() auf.
     document.querySelector('input[name="anzeigen"]').addEventListener('click', ladeTabelle);
     }
    }
  });

  function ladeTabelle() {
   // Den Wert des ausgewählten Elements in der Auswahlliste auslesen
   var sel = document.getElementById("selection").options[document.getElementById("selection").selectedIndex].value;

   // Den Wert (sel) mit der Anfrage über GET senden
   xhr.open("GET", document.URL + "?ausgeben=" + sel);
   xhr.send(null);

   // Auf eine Antwort warten
   xhr.onreadystatechange = function () {
    if (xhr.readyState == 4 && xhr.status == 200) {

     // Die erhaltenen Daten ausgeben
     document.getElementById("ausgabe").innerHTML = xhr.responseText;
    }
   }
  }
  </script>

  <style>
  table#table {
   border-spacing: 1px;
   background-color: #A4A4A4;
  }

  table#table tr th,
  table#table tr td {
   padding: 3px;
  }

  table#table tr th {
   background-color: #CECECE;
  }

  table#table tr:nth-child(even) {
   background-color: #ECECEC;
  }

  table#table tr:nth-child(odd) {
   background-color: #FFFFFF;
  }

  table#table tr:hover {
   background: #FFFFCE;
  }

  table#table td:hover {
   background: #FFFF9F;
  }
  </style>
  
<!--Funktion für Bauzinsen von Selectbox zu Inputfeld-->  
<script>
function myFunction1(e) {
    document.getElementById("myText1").value = e.target.value
}
function myFunction2(e) {
    document.getElementById("myText2").value = e.target.value
}
function myFunction3(e) {
    document.getElementById("myText3").value = e.target.value
}


</script>

 </head>
<body>

<p>
 <label>Finanzierungszweck: 
 <select id="selection">
 </select>
 </label>
 <input type="button" name="anzeigen" value="anzeigen">
</p>

<div id="ausgabe"></div>

</body>
</html>
Werner schrieb am Freitag, den 16 April 2021 #27
Das Gefällt mir sehr gut :up:
Alexander ✶✶✶✶✶ schrieb am Sonntag, den 22 August 2021 #28
Hallo Werner, vielen lieben Dank für das Tutorial, hat super geklappt!

Ich habe zwei Fragen, wobei die erste für mich wichtiger wäre, falls du Zeit und Lust hast, mir einen Tipp zu geben:

1. Kann man irgendwie noch eine Möglichkeit einbauen, dass die Daten nach einer Spalte - z.b. nach $s[1] - vor der Ausgabe sortiert werden?

2. Ich erhalte die csv Dateien leider bereits mit Spaltennamen. In deinem Script werden die aber auch noch mal erstellt. Kann man dem Script von dir sagen, dass er die csv-Datei erst ab der zweiten Zeile auslesen soll?

Ich weiß, dass du das alles in deiner Freizeit machst, wäre dir daher sehr, sehr dankbar, wenn du eine Idee hättest.

LG, Alexander
Werner schrieb am Sonntag, den 22 August 2021 #29
Hallo Alexander,
schaue dir diese Seite an: » werner-zenk.de/php/csv-datei_auslesen.php
Dort ist ein JavaScript ("TableSort" vom Autor: j-berkemeier) dabei mit der man die Tabelle sortieren kann.
Gehe auch zur Website des Autors dort stehen Möglichkeiten wie die Tabelle vorsortiert werden kann.

Zitat:
2. Ich erhalte die csv Dateien leider bereits mit Spaltennamen. In deinem Script werden die aber auch noch mal erstellt. Kann man dem Script von dir sagen, dass er die csv-Datei erst ab der zweiten Zeile auslesen soll?

Auf der verlinkten Seite von mir das zweite Beispiel: "CSV-Datei auslesen (ohne Spaltenüberschriften)".
ALexander schrieb am Sonntag, den 22 August 2021 #30
Vielen Dank für die prompte Antwort! Super, hat geklappt!

Es wird nun nach Datum sortiert, komischerweise ist die Sortierung trotzdem nicht richtig. Keine Ahnung woran das liegt. Blöderweise sind die csv-Dateien Kommagetrennt, sodass ich den Trenner in den Scripten auf "," umstellen musste und dadurch die Ergebnisse folgendermaßen aussehen "20.08.2021" (also mit Anführungszeichen), aber das ist ja egal - auch beim Preis, der wird dann in zwei Spalten dargestellt aber auch das ist mir egal, da es mit nicht um den Preis geht. Aber ich denke an den Anführungszeichen wird die Sortierung kaum scheitern. Wenn aber (in meinem Fall) nicht richtig sortiert wird, kann ich auch deinen ersten Script (also hier von dieser Seite) nutzen, denn da muss ich die csv-Datei nicht jedes mal überschreiben, sondern kann die bequem über Dropdown auswählen. Das ist wirklich toll. Nochmals vielen Dank für das Schript!

Natürlich könnte ich die csv-Datei umwandeln, aber ich wollte mir ja gerade die Arbeit erleichtern, damit ich die nicht immer öffnen muss (ich bekomme 2 mal täglich eine neue) und dachte mir, ich schiebe sie einfach auf den Server und kann leichter auf die Daten zugreifen, ohne jedes mal Calc zu öffnen.

Einen schönen Sonntag und danke für deine Hilfe!

LG Alexander