0 votes
in SoSci Survey (dt.) by s293816 (120 points)

Liebe sosci Team,

in meinem Fragebogen verwende ich ein lab.js Experiment. Gerne möchte ich aus der von labjs hochgeladenen .csv Datei den Performance Wert aus dem Experiment in meinem sosci Datensatz abspeichern, um diesen dann noch zu verwenden.

Dafür habe ich nun eine neue interne Variable SU04_01 erstellt und einen Code geschrieben, um aus der .csv Datei den Wert zu extrahieren. Jedoch bekomme ich eine Warnung, dass der Befehl fopen() nicht freigegeben ist, aber ich bei Unbedenklichkeit einen Admin um Freischaltung kontaktieren könnte (sosci läuft über Uni Server). Da ich mir aber nicht sicher bin, ob die Herangehensweise richtig ist, wollte ich das zuerst abklären. Ist es so möglich, den Wert aus der .csv Datei zu extrahieren?

Vielen Dank für die Hilfe!

Das Experiment hat die Kennung EX01 und der benötigte Performance Wert befindet sich in Zeile 23, Spalte 11.
Hier der Code:

$csvFile = "upload://'.value('EX01').'";

// Öffne CSV-Datei
if (($handle = fopen($csvFile, 'r')) !== FALSE) {
    $row = 0;
    $index = null;

    // CSV-Datei Zeile für Zeile
    while (($data = fgetcsv($handle, 1000, ',')) !== FALSE) {
        $row++;
        if ($row == 23) {
            $index = $data[10]; // Spaltenindex beginnt bei 0
            break;
        }
    }
    fclose($handle);

    // Speicher  Wert in SU04_01
    put('SU04_01', $index);
}

2 Answers

0 votes
by SoSci Survey (327k points)

Der Befehl fopen() ist alles andere als unbedenklich - damit könnten Sie auf Inhalte auf dem Server zugreifen, die Sie nichts angehen ;)

Die eleganteste Lösung bestünde darin, dass Sie den Wert mittels JavaScript direkt nach Ende des Experiments auslesen und in eine interne Variable schreiben.

Mittelfristig können wir auch darüber nachdenken, Uploads über eine gesonderte Funktion im Fragebogen verfügbar zu machen. Das gekoppelt mit dem Auslesen der CSV-Werte via fgetcsv() ist aber nicht ganz trivial. Je nachdem, wie Ihr Zeitplan aussieht, können wir über eine geeignete Lösung nachdenken?

by s293816 (120 points)
Vielen Dank für die rasche Antwort und die Erklärung. Ich merke wieder, dass viel Wissen fehlt..

Generell wäre es sicher sehr nützlich, auf Uploads über eine Funktion im Fragebogen zugreifen zu können, gerade wenn es z.B. files von lab.js sind.

Für mein aktuelles Problem, wäre auch eine elegante Lösung mit JavaScript super. Das würde ich gerne probieren. Müsste ich dafür in lab.js den Wert auslesen und an sosci senden, welches ihn dann in der internen Variable speichert? Gibt es dafür vielleicht eine Vorlage oder haben Sie einen Tipp?

Vielen Dank!
0 votes
by SoSci Survey (327k points)

Müsste ich dafür in lab.js den Wert auslesen und an sosci senden, welches ihn dann in der internen Variable speichert?

Ich befürchte, eine Vorlage gibt es noch nicht. Im Prinzip geht es an der Stelle los, an welcher lab.js den Fragebogen informiert, dass es nun fertig sei:

Store the data in the survey (lab.js)

Den dort angegeben Beispiel-Code könnten Sie einmal wie folgt abändern. Ich gehe hier davon aus, dass Sie eine intene Variable mit der Kennung IV01_01 auf die Fragebogen-Seite gezogen haben.

<script>
  // Listen for the study sending data
  window.addEventListener('message', function _labjs_data_handler(event) {
    if (event.data.type === 'labjs.data') {
      const data = event.data.csv;

      // Hier der SoSci-spezifische Teil
     console.log(data);
     document.getElementById("IV01_01").value = data[28];

       // ... finally, stop listening for further data
      window.removeEventListener('message', _labjs_data_handler);
    }
  })
</script>

Exemplarisch habe ich hier angenommen, dass data ein Array ist, und dass Sie den Wert an der Position 28+1 auslesen möchten. Das console.log() zeigt Ihnen den echten Inhalt von data in der Fehlerkonsole des Browsers an. Auf dieses Basis können Sie dann das richtige Element auswählen und die [28] entsprechend ersetzen.

Posten Sie gerne einen Screenshot aus der Browser-Konsole, wenn Sie unsicher sind (Sie müssen das Objekt evtl. erst mit einem Pfeil links vom Objekt aufklappen) und/oder erstellen Sie einen Pretest-Link direkt für die betroffene Seite und posten Sie diesen hier.

by s293816 (120 points)
Oh super, vielen lieben Dank für die detaillierte Hilfe!
Es hat geklappt, der benötigte Wert wird jetzt unter der Variable SU04_01 gespeichert.

Da die Daten kein Array sind, habe ich den Code noch etwas angepasst (mit Hilfe von Google). Ich hoffe, das ist alles so in Ordnung.

<script src="https://cdnjs.cloudflare.com/ajax/libs/PapaParse/5.3.0/papaparse.min.js"></script>
<script>
  // Listen for the study sending data
  window.addEventListener('message', function _labjs_data_handler(event) {
    if (event.data.type === 'labjs.data') {
      const csvData = event.data.csv;

      // Parse the CSV data
      Papa.parse(csvData, {
        complete: function(results) {
          const data = results.data;

          // Hier der SoSci-spezifische Teil
          console.log(data);
          document.getElementById("SU04_01").value = data[244][6]; // row245 column7

          // ... finally, stop listening for further data
          window.removeEventListener('message', _labjs_data_handler);
        }
      });
    }
  });
</script>
by SoSci Survey (327k points)
Eigentlich sollte lab.js die Daten bereits als Struktur liefern, sodass das Parsing eigentlich nicht mehr notwendig sein sollte. Aber wenn Sie mit der Lösung zufrieden sind, dann machen Sie noch ein paar Tests, ob es gut läuft - und manchmal ist gut dann halt auch gut genug :)
by s293816 (120 points)
edited by s293816
Ich habe es ohne Parsing nicht hinbekommen den richtigen Wert zu speichern, es speichert immer 'undefined'. Also nehme ich doch einfach die gut genug Lösung mit parsing und mache noch einige Tests - vielen, vielen Dank nochmals für die Hilfe! :)
by SoSci Survey (327k points)
Wenn Sie unter

  if (event.data.type === 'labjs.data') {

noch ein

    console.log(event.data);

setzen, sollten Sie die Datenstruktur in der Browserkonsole durchklicken können. Sie vwerwenden aktuell das "csv" Objekt daraus. Parallel dazu sollte es die Daten auch als Array/Objekt geben. Aber das ist jetzt wirklich nicht so wichtig :)
by s293816 (120 points)
Danke! Wenn es mir in den Fingern juckt, probiere ich es nochmal aus vor der Datenerhebung :)

Willkommen im Online-Support von SoSci Survey.

Hier bekommen Sie schnelle und fundierte Antworten von anderen Projektleitern und direkt von SoSci Survey.

→ Eine Frage stellen


Welcome to the SoSci Survey online support.

Simply ask a question to quickly get answers from other professionals, and directly from SoSci Survey.

→ Ask a Question

...