Jump to content
Unity Insider Forum

Excel Tabelle in Unity einbinden


Willy_Wonder

Recommended Posts

Hallo, ihr netten Menschen! es ist nun meine zweite Frage hier im Forum :) nachdem ich sehr erfolgreich eure Hilfe umsetzen konnte, kommt nun eine weitere frage, für die ich einen Ansatz brauche. ich bin immer noch ein noob, was scripting angeht...:D

es geht um folgendes: ich habe eine szene mit mehreren Objekten. Jetzt ist es so, dass ich die Zustände für die jeweiligen Anlagen aus einer Excel Tabelle ziehen möchte. zB wenn es in der Tabelle steht : "Anlage in Ordnung" soll meiner Anlage eine Farbe zugeordnet werden. Wenn der Zustand in der Tabelle geändert wird, ändert die Anlage wieder die Farbe.  Ist es möglich? und wenn ja, könnte mir vielleicht bitte jemand einen Denkanstoß geben? :3

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • Antworten 59
  • Created
  • Letzte Antwort

Wenn es Excel dateien sein müssen würde ich nach einer .NET lib suchen die das einlesen übernimmt.

Falls du CSV nehmen kannst wird das ganze einfacher dann musst du nur parsen. Angenommen deine CSV hat folgende Einstellung (new Column (;) new Line (\n)) dann würde ein parsing für deinen Fall ungefähr so aus sehen.

private Dictionary < string, bool > GetAnlagenStatus(string csvString) {
 string[] csvLines = csvString.Split("\n");
 Dictionary < string, bool > anlagenStatus = new Dictionary < string, bool > ();
 foreach(string csvLine in csvLines) {
  string anlagenName = csvLine.Split(";")[0];
  string active = csvLine.Split(";")[1];

  if (active == "1") {
   anlagenStatus.Add(anlagenName, true);
  } else {
   anlagenStatus.Add(anlagenName, false);
  }
 }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Naja pflegen kann man es schon in excel man sollte es halt as csv datei exportieren

https://de.wikipedia.org/wiki/CSV_(Dateiformat)

Bei dir könnte dann eine CSV datei dann z.B so aussehen

Anlage1;1

Anlage2;0

Anlage3;1

 

In Excel wären das zwei Spalten in denen dann die Werte stehen

Mit dem oben eingefügten script kannst du das dann auslesen

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich stehe gerade wegen diesem CSV aufm schlauch :o es ist ja im endeffekt eine Excel datei?

habe jetzt eine beispieldatei: 3 spheres. ich habe 2 spalten im excel erstellt, sehen so aus:

Sphere (1)     1

Sphere (2)     0

Sphere (3)     1

 

ich speichere diese als CSV Trennzeichen (?)

 

angenommen, 1 ist rot, 0 ist blau. Wie soll denn unity das jetzt nachvollziehen? ich werde aus deinem script leider auch nicht schlau :(

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du erzeugst eine CSV Datei aus deiner Excel Datei, die würde dann so aussehen:
Sphere (1),1
Sphere (2),0
Sphere (3),1

Über das Skript - das Mabenan erwähnt hat - liesst du diese Datei dann ein:
1) Die Datei schiebst du in den Projektfolder von Unity.
2) Du erzeugst ein leeres GameObjekt und benennst es z.b. nach "CSVReader" um.
3) Erzeugst das Skript "CSVReader.c"s (Rechte Maustaste im Projektfolder "Create #C Skript" und den Inhalt hineinkopieren)
4) Du ziehst das Skript CSVReader.cs auf das GameObject "CSVReader" (in den Slot "csvFile")
5) Nachdem du Unity startest, solltest du nun eine Ausgabe in der Unityconsole sehen mit dem Inhalt deiner CSV Datei.
=>
Deine Daten können nun über ein Unityskript weiterverarbeitet werden. Die Daten sind in einem 2-dimensionalen Array abgelegt das wie folgt aussieht:
grid[2,3]
=>
          0                       1
==================
0        Sphere (1)        1
1        Sphere (2)        0
2        Sphere (3)        1

Zitat

Wie soll denn unity das jetzt nachvollziehen? ich werde aus deinem script leider auch nicht schlau 

Du kommst leider um eigenen Code hier nicht herum, eine Weiterverarbeitung könnte z.b. wie folgt aussehen:
 

        for (int x = 0; x < grid.GetUpperBound(0); x++)
        {        
            for (int y = 0; y < grid.GetUpperBound(1); y++)
            {
                // Ich hole mir hier nun alle Spalten der Zeile 1,  y = 0 Zeile 1 ist!
                // Leerzeichen nicht mit ausgeben
                if (grid[x, y] != "" && (y == 0))
                {
                    Debug.Log("Zeile 1: " + grid[x, 0]); // Der Inhalt von grid[x, 0] ist hier "Sphere (1)"
                    if (x == 1) // Wert für die 2. Spalte auslesen
                    {
                        if (grid[x, y] == "1") // Wenn der Wert für die 2. Spalte = "1" ist
                        {
                            // Hier habe ich nun erkannt, daß für Sphere(1) eine "1" gesetzt ist
                            Debug.Log("Für Objekt " + grid[x, 0] + " wurde eine "+ grid[x, y] + " gesetzt!");
                            // Nun weiss ich, daß ich für Sphere(1) ein rotes Material setzen muss, wenn 1 = rot bedeutete!
                            // MeshRenderer mesh = gameObjectSphere1.GetComponent<MeshRenderer>();
                            // mesh.material = myRedMaterial;
                            //
                        }
                    }
                }
            }
        }

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du musst in deiner CSV-Datei ein "," als Separator verwenden!  Das kann man in Excel beim Export einstellen.
";" Kann das Skript leider nicht verarbeiten.

Deine Ausgabe muss dann so aussehen:
Sphere (1)|1||
Sphere (2)|0||
Sphere (3)|1||
|||

Schau dir den Code oben an, viel einfacher wird es leider nicht mehr. Du musst den ausgelesenen Zahlen (je Objekt) nun Materialien in Unity zuordnen und dann dem Meshrenderer des jeweiligen Objektes zuweisen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 15 Stunden schrieb Zer0Cool:

Du musst in deiner CSV-Datei ein "," als Separator verwenden!  Das kann man in Excel beim Export einstellen.
";" Kann das Skript leider nicht verarbeiten.

Deine Ausgabe muss dann so aussehen:
Sphere (1)|1||
Sphere (2)|0||
Sphere (3)|1||
|||

Schau dir den Code oben an, viel einfacher wird es leider nicht mehr. Du musst den ausgelesenen Zahlen (je Objekt) nun Materialien in Unity zuordnen und dann dem Meshrenderer des jeweiligen Objektes zuweisen.

vielen dank für deine geduld mit mir ! :> ich werde das gleich ausprobieren und berichte dann, was dabei rausgekommen ist :)

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Warum kannst du nicht das Standardtrennzeichen ";" verwenden? Gut, das Regex im Beispiel ist nicht gerade übersichtlich, ebenso ist das Beispiel aus dem WIKI hoffnungslos überdimensioniert. Wie soll da ein Einsteiger durchblicken?

Hier ist ein Link zu Stackoverflow mit einer kleinen und brauchbaren Lösung:

using System.IO;

static void Main(string[] args)
{
    using(var fs = File.OpenRead(@"C:\test.csv"))
    using(var reader = new StreamReader(fs))
    {
        List<string> listA = new List<string>();
        List<string> listB = new List<string>();
        while (!reader.EndOfStream)
        {
            var line = reader.ReadLine();
            var values = line.Split(';');

            listA.Add(values[0]);
            listB.Add(values[1]);
        }
    }
}

Hab ich in Unity nicht getestet, aber ich denke, das macht, was es soll.

 

Aber du solltest dir nochmal überlegen:

- den Status der Anlagen in Excel ändern

- csv-Datei daraus machen

- in Unity einlesen

Warum nicht gleich den Status in der csv-Datei ändern? Spart dir einen Schritt. Oder die Excel-Tabelle direkt auslesen, dafür gibt es auch massig Beispiele.

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 17 Minuten schrieb Hrungdak:

Warum kannst du nicht das Standardtrennzeichen ";" verwenden? Gut, das Regex im Beispiel ist nicht gerade übersichtlich, ebenso ist das Beispiel aus dem WIKI hoffnungslos überdimensioniert. Wie soll da ein Einsteiger durchblicken?

haha, danke für dein verständis :D genau das ist gerade das problem - ich kann mir diese skripte nicht besonders gut auseinander pflücken um dahinterzusteigen...

deins ausm beispiel sieht ziemlich übersichtlich aus, mal sehen ob es klappt!

noch eine kleine frage:


            listA.Add(values[0]);
            listB.Add(values[1]);

das sind meine Zustände dann qausi? und wenn meine anlagen die farben ändern sollen, wenn die zustände in der liste geändert werden, so muss ich diesen skript einfach mit einer if funktion erweitern, in der diese farbänderung festgehalten ist, richtig?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn du Split[','] durch Split[';'] ersetzt, kannst du auch deine Datei mit ";" verwenden!

So, dann hier mal eine stark vereinfachte und verständlichere Variante, beim Code aus dem Video wird die Zeile 1 und Spalte 1 immer übersprungen.

 

/*
	CSVReader by zer0f0rce. (27/4/2017)
*/

using UnityEngine;

public class SimpleCSVReader : MonoBehaviour
{
    public TextAsset csvFile;
    public void Start()
    {
        string[] Zeilen = csvFile.text.Split('\n');
        int aktuelleZeile = 0;
        foreach (string Zeile in Zeilen)
        {
            int aktuelleSpalte = 0;
            aktuelleZeile += 1;
            string[] Spalten = Zeile.Split(','); // Wenn du hier wieder Zeile.Split(';') nimmst liest er wieder eine Datei mit Semikolons!
            foreach (string Spalte in Spalten)
            {
                aktuelleSpalte += 1;
                Debug.Log("Zeile " + aktuelleZeile + " Spalte " + aktuelleSpalte + " = " + Spalte);
            }
        }
    }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using System.IO;


public class Zustandsaenderung : MonoBehaviour {
    public TextAsset csvFile;




    void Start () {

        readCSV ();

    }

    void readCSV ()
    {
        string[] records = csvFile.text.Split ('\n');
        for (int i = 1; i < records.Length; i++) {
            string[] fields = records [i].Split (',');
            if (float.Parse (fields [1]) == 1) {
                GetComponent<Renderer> ().materials [0].color = Color.red;
            }
        }
    }
}

 



das hab ich jetzt bei einer Testdatei zusammengebastelt, aber er übernimmt trotzdem nicht die rote farbe ..  zumal im video das skript auf die kamera geworfen wird Oo ich habe jetzt einfach cubeTest als GameObject rausgenommen, weil es für mich keinen sinn ergeben hat.

das wäre meine Liste:

Anlage,Zustand

Cube1,1

Cube2,2

Cube3,1

 

 

man, das ist so dermaßen deprimierend :(

Link zu diesem Kommentar
Auf anderen Seiten teilen

Lies mal meinen Post genau durch ... und verwende ggf. mein Skript.
Wenn du bei GetComponent() mal ein Debug() hinzufügst, dann wirst du sehen, daß er gar nicht zu dieser Zeile hinkommt.
Wie ich bereits sagte, das Skript welches du verwendest überspringt die 1. Zeile und die 1. Spalte und damit fängt er direkt bei Sphere (2) an!

Ansonsten korrigiert sehe es so aus (ist aber komplett ungetestet):

using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using System.IO;

public class Zustandsaenderung : MonoBehaviour {
    public GameObject cubeTest;
    public TextAsset csvFile;

    void Start () {
        readCSV ();
    }

    void readCSV ()
    {
        string[] records = csvFile.text.Split ('\n');
        for (int i = 0; i < records.Length; i++) {
            string[] fields = records [i].Split (',');
            if (float.Parse (fields [1]) == 1) {
                GetComponent<Renderer> ().materials [0].color = Color.red;
            }
        }
    }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 7 Minuten schrieb Zer0Cool:

Lies mal meinen Post genau durch ... und verwende ggf. mein Skript.
Wenn du bei GetComponent() mal ein Debug() hinzufügst, dann wirst du sehen, daß er gar nicht zu dieser Zeile hinkommt.
Wie ich bereits sagte, das Skript welches du verwendest überspringt die 1. Zeile und die 1. Spalte und damit fängt er direkt bei Sphere (2) an!

Ansonsten korrigiert sehe es so aus (ist aber komplett ungetestet):


using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using System.IO;

public class Zustandsaenderung : MonoBehaviour {
    public GameObject cubeTest;
    public TextAsset csvFile;

    void Start () {
        readCSV ();
    }

    void readCSV ()
    {
        string[] records = csvFile.text.Split ('\n');
        for (int i = 0; i < records.Length; i++) {
            string[] fields = records [i].Split (',');
            if (float.Parse (fields [1]) == 1) {
                GetComponent<Renderer> ().materials [0].color = Color.red;
            }
        }
    }
}

 

auf deine korrigierte version bin ich mittlerweile auch gekommen, funktioniert leider immer noch nicht...

 

vor 40 Minuten schrieb Zer0Cool:

Wenn du Split[','] durch Split[';'] ersetzt, kannst du auch deine Datei mit ";" verwenden!

So, dann hier mal eine stark vereinfachte und verständlichere Variante, beim Code aus dem Video wird die Zeile 1 und Spalte 1 immer übersprungen.

 


/*
	CSVReader by zer0f0rce. (27/4/2017)
*/

using UnityEngine;

public class SimpleCSVReader : MonoBehaviour
{
    public TextAsset csvFile;
    public void Start()
    {
        string[] Zeilen = csvFile.text.Split('\n');
        int aktuelleZeile = 0;
        foreach (string Zeile in Zeilen)
        {
            int aktuelleSpalte = 0;
            aktuelleZeile += 1;
            string[] Spalten = Zeile.Split(','); // Wenn du hier wieder Zeile.Split(';') nimmst liest er wieder eine Datei mit Semikolons!
            foreach (string Spalte in Spalten)
            {
                aktuelleSpalte += 1;
                Debug.Log("Zeile " + aktuelleZeile + " Spalte " + aktuelleSpalte + " = " + Spalte);
            }
        }
    }
}

 

meinst du diesen skript, den ich ausprobieren soll?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

Ankündigungen


Hy, wir programmieren für dich Apps(Android & iOS):

Weiterleitung zum Entwickler "daubit"



×
×
  • Neu erstellen...