CSV Import/Noteneintragen -> Moodle
Samantha
- php
Hy!!
Ich hab da ein Problem!! Für die Schule müssen wir so ein blödes Projekt machen.
Wir müssen eine csv datei importieren, die daten auslesen und in die Datenbank schreiben, damit die Testschüler die Punkte und Noten auf ihre Testübung sehen können... Leider klappt dass nicht!!
Hat vielleicht einer ein Idee, wie man Dinge in die Moodledatenbank reinschreiben kann...
Also das ist die csv datei:
Vorname,Nachname,ID-Nummer,Institution,Abteilung,E-Mail-Adresse,Aufgabe: Test,Summe für den Kurs
Muster,Student1,,,,student@gmx.at,90.00,90.00
Muster,Student2,,,,student2@gmx.at,90.00,90.00
Wie kann man diese auslesen, so das jede Info in einer Variable steht... also zB $vorname = Muster, $nachname = student1 usw. Dann müsste ich sie doch einfach mit einem INSERT INTO-Statement in die Datenbank schreiben können, oder? Ich weiß ja nicht, wie das im Moodle läuft... Mein Lehrer sagt ja wir müssen auf den Core Code nicht zugreifen, aber wie sollen wir die Übung dann einbinden oder etwas in die Datenbank schreiben?
Bisher haben wir nur das CSV auslesen, aber so klappt das nicht:~~~php
<html>
<title> CSV-Einlesen </title>
<body>
<?php
$row = 1; // Anzahl der Arrays
$handle = fopen ("testfile.csv","r"); // Datei zum Lesen �ffnen
while ( ($data = fgetcsv ($handle, 1000, ";")) !== FALSE ) { // Daten werden aus der Datei
// in ein Array $data gelesen
$num = count ($data); // Felder im Array $data
// werden gez�hlt
$row++; // Anzahl der Arrays wird
$max = 0; // inkrementiert
for ($c=0; $c < $num; $c++) { // FOR-Schleife, um Felder
if($c == 0) print "Student: ".$data[$c]. "<br>\n";
elseif ($c == 1) print $data[$c]. "<br>\n";
else
{ print "Abgabe".($c-1).": ".$data[$c] . "<br>\n"; // des Arrays auszugeben
if (($data[$c] > $max) && ($c >1))
{
$max = $data[$c];
}
}
}
print "Maximal erreichtes: ".$max."<br>\n<br>\n";
}
fclose ($handle);
?>
</body>
</html>
Hab versucht mit explode() zu arbeiten, aber irgendwie wird nie das richtige ausgegeben!
LG Samantha
Moin!
<?php
/*
$filename: Name der CSV-Datei
$trenner : Trenner der Datensätze
$remark : Kennzeichen für Kommentarzeilen
$maxCols : Wie viele Spalten sollen maximal(!) eingelesen werden (Vorteil: in der letzten Spalte kann dann der Trenner unmaskiert stehen)
*/
function fastixCsvToArray($filename, $trenner=';', $remark='#', $maxCols=3) {
$dummy=fastixCheckFile($filename,'r');
$ar=array();
$lines = file($filename);
foreach ($lines as $line) {
$line=trim($line);
if (isset($line[0]) && $remark != $line[0]) {
$arLineTemp=explode($trenner, $line, $maxCols);
$arLine=array();
foreach ($arLineTemp as $elem) {
$arLine[]=trim($elem);
}
$ar[]=$arLine;
}
}
return $ar;
}
function fastixCsvToAssocArray($filename, $trenner=';', $remark='#', $maxCols=3) {
#die($filename);
$dummy=fastixCheckFile($filename,'r');
$ar=array();
$lines = file($filename);
foreach ($lines as $line) {
$line=trim($line);
if ($remark != $line[0]) {
$arLineTemp=explode($trenner, $line, $maxCols);
$arLine=array();
for ($i=0;$i < $maxCols; $i++) {
$arLineTemp[$i]=trim($arLineTemp[$i]);
if ($i == 0) {
$assoc=$arLineTemp[$i];
} else {
if ($maxCols == 2) {
$ar[$assoc]=$arLineTemp[$i];
} else {
$ar[$assoc][$i]=$arLineTemp[$i];
}
}
}
}
}
return $ar;
}
function fastixCheckFile($filename, $right='r') {
/*
Beendet Script mit Fehlermeldung, wenn Datei nicht vorhanden oder die erforderlichen Rechte fehlen:
r: lesen
w: schreiben
*/
if(!is_file($filename)) {
die ('Fatal: '.$filename.' ist keine Datei!!!'."\n");
}
if(!is_readable($filename)) {
die ('Fatal: '.$filename.' ist nicht lesbar!'."\n");
}
if ('w'==strtoupper(substr($right,1))) {
die ('Fatal: '.$filename.' ist nicht schreibbar!'."\n");
}
return 0;
}
?>
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix
Danke für die Hilfe
Moin!
Vorname,Nachname,ID-Nummer,Institution,Abteilung,E-Mail-Adresse,Aufgabe: Test,Summe für den Kurs
Zu meiner Zeit hätten wir den Lehrer "geprügelt":
1. Die ID-Nummer gehört in Spalte 1
2. Keine Normalform
3. Es heisst zwar CSV (character separated values), aber der Trenner ist üblicherweise ein Semikolon. Grund: Das Komma wird in der Menschensprache seit dem Mittelalter zu häufig verwendet.
Nimm die Funktion fastixCsvToAssocArray:
$ar=fastixCsvToAssocArray($filename, $trenner=',', $remark='#', $maxCols=8);
foreach $ar as $tupel {
$sql='
SELECT INTO `tabelle`
SET
`Vorname` = "'.mysql_real_escape_string($tupel[0]).'",
`Nachname` = "'.mysql_real_escape_string($tupel[1]).'",
...
`Summe` = "'.mysql_real_escape_string($tupel[1]).'"';
$result = mysql_query($sql) or die ('Fehler: '.mysql_error().'<pre>'.$sql.'</pre>')
}
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix
Moin!
Nimm die Funktion fastixCsvToAssocArray:
change to: Nimm die Funktion fastixCsvToArray:
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix
Moin!
Nimm die Funktion fastixCsvToAssocArray:
Korrigiere zu: Nimm die Funktion fastixCsvToArray:
Grund: Sonst "fehlen" Dir nicht nur (scheinbar) die Vornamen, es fehlen auch die Ergebnisse des zweiten Peter, der ersten bis dritten Katja (wenn es davon drei (Peter) oder vier (Katja) gibt.
Das war auch der Grund, warum die ID in die erste Spalte gehört.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix
Hi!
Leider klappt dass nicht!!
"Klappt nicht" klappt nicht als Fehlerbeschreibung. Was soll passieren, was passiert stattdessen? Die Klärung der zweiten Teilfrage ist wichtig, denn so kann man dem Fehler auf die Spur kommen. Also schau dir mitteld Kontrollausgaben an, was tatsächlich in den Variablen steht und als Ergebnis von Ausdrücken entsteht, und vergleiche das mit deinen Wünschen. Kontrollausgaben können meist schon mit einem einfachen echo erfolgen, genauer ist aber var_dump().
Muster,Student1,,,,student@gmx.at,90.00,90.00
Muster,Student2,,,,student2@gmx.at,90.00,90.00Wie kann man diese auslesen, so das jede Info in einer Variable steht... also zB $vorname = Muster, $nachname = student1 usw. Dann müsste ich sie doch einfach mit einem INSERT INTO-Statement in die Datenbank schreiben können, oder?
Dazu brauchst du keine tausend Einzelvariablen. fgetcsv() liefert dir ein Array. Dessen Elemente kannst du genauso wie einfache Variablen verwenden.
Ich weiß ja nicht, wie das im Moodle läuft... Mein Lehrer sagt ja wir müssen auf den Core Code nicht zugreifen, aber wie sollen wir die Übung dann einbinden oder etwas in die Datenbank schreiben?
Der Moodle-Weg ist allerdings seit Version 2.0 nicht mehr, SQL-Statements selbst zusammenzusetzen, denn dabei muss man den Kontextwechsel beachten. Stattdessen gibt es den Database abstraction layer. Mehr kann ich dazu aber nicht sagen, ich hab nur mal kurz in Moddle reingeschaut, als da noch deren unsägliches addslashes-Konzept genutzt wurde. Es ist jedenfalls besser sich am vorhandenen Konzept zu orientieren, auch wenn einem das selbst missfällt, als Erweiterungen nach eigenen Gutdünken vorzunehmen, die beim nächsten Versionswechsel nicht mehr richtig mitspielen (solange der keine grundlegenden Inkompatibilitäten mitbringt).
Lo!
Danke, hat mir sehr geholfen!!
p.s: Manchmal klappt es einfach nur nicht - man weiß eben nicht warum oder wo... *gg*