Import csv auswerten

Ninox Profile

Hallo,

Ich habe eine csv ca. 30000 Datensätze. Diese soll jeden Tag eingelesen und dann nach Bedingungen in eine andere tabelle geschrieben werden. Danach werden die originaldaten gelöscht.

Habe hierzu eine tabelle wo die csv als Input original eingelesen ist. Geschrieben werden die Daten aus der input tabelle in eine weitere. 

Jetzt ist es so das die leseart der csv vom Text 6 abhängig ist. Hier stehen Nummern. Ist die Nummer 1 drin, dann befindet sich in den übrigen Feldern des datensatzes die stammdaten. Name usw. Das ist immer der erste Datensatz zu einem Kunden. Dann steht zum Beispiel die 4 drin. Jetzt sind in den übrigen Feldern der Inhalt von dem Kunden. Das kann eine Zeile aber auch 20 zeilen sein. 

Der nächste Kunde wo dann wieder die 1 stehen tut beendet das ganze.

Wie schaffe ich das nach Bedingungen der Zahl von Text 6, also 1bis 4 die zugehörigen Felder zu kopieren in die nächste Tabelle. Da sollen die Daten pro Kunde mit Inhalt erscheinen in einem Datensatz. Das Skript soll so die ganze input tabelle abarbeiten.

Bin zu blöd dafür und daher offen für jeden Tipp 

Ninox Profile

Hallo,

ich weiß nicht ob ich es richtig verstehe, aber so als Ansatz:


---

for i in select INPUT ['Text 6'=1] do
let myNextId:=min(select INPUT['Text 6'=1 and number(Nr)>i.number(Nr)].number(Nr));
let newK:=create Kunden;
new.NAME:=i.TEXT7;
new.ADRESSE:=TEXT8;
for j in select INPUT[ number(Nr)>i.number(Nr) and number(Nr)<myNexId] do
if j.'Text 6'=4 then .....

end
end
end

---

Leo

Ninox Profile

Danke dir Leo,

soweit funktioniert das schon mal super. 

Ist es möglich die felder "Text 15 bis Text 17" bei bedingung "Text 6 = 4" in einem Feld der neuen Tabelle zusammen zu setzen? So das der Text wieder als ganzes erscheint.

Anbei mal der einfache aufbau. (insgesamt sind es pro datensatz 37 Felder ) 

Ninox Profile

Im Aufbau fehlte noch was

Ninox Profile

Wenn die Zeilen untereinander sein sollten dann:

---

for i in select INPUT ['Text 6'=1] do
let myNextId:=min(select INPUT['Text 6'=1 and number(Nr)>i.number(Nr)].number(Nr));
let newK:=create Kunden;
new.NAME:=i.'Text 8';
new.KVNUMMER:='Text 9';
new.ADRESSE:='Text 15';
new.TEXTFELD:=join(select INPUT[ number(Nr)>i.number(Nr) and number(Nr)<myNexId and 'Text 6'=4] .('Text 15'+'Text 16'+'Text 17'),"
")
end

---

wenn alles in eine Zeile gehört dann:

---

for i in select INPUT ['Text 6'=1] do
let myNextId:=min(select INPUT['Text 6'=1 and number(Nr)>i.number(Nr)].number(Nr));
let newK:=create Kunden;
new.NAME:=i.'Text 8';
new.KVNUMMER:='Text 9';
new.ADRESSE:='Text 15';
new.TEXTFELD:=join(select INPUT[ number(Nr)>i.number(Nr) and number(Nr)<myNexId and 'Text 6'=4] .('Text 15'+'Text 16'+'Text 17')," ")
end

---

Leo

Ninox Profile

Super!

vielen Dank. Funktioniert so auch nebenbei noch schneller.

Ninox Profile

Kann ich die do as server variante verwenden ? Wenn ich das mit der kompletten CSV mache kommt bitte prüfen sie ihre internetverbindung (Zeitüberschreitung)

oder soll ich die Mldung einfach ignorieren, da ja der Server arbeitet und erst wenn es fertig ist wieder antwortet ?

Ninox Profile

hab mich ein bischen in der Datensatzanzahl getäuscht.   es sind : 127.718 Datensätze welche verarbeitet werden müssen. Jetz komm ich nicht mehr auf die Tabelle wo es neu geschrieben wird. War über do as Server angestoßen wurden. 

Kann man hier was an der Performents tun?

Ninox Profile

Leo ist es möglich beim einlesen der csv nur neue noch nicht vorhandene Datensätze einzulesen? Dann nur diese in die neue tabelle zu schreiben mit deinem Skript. So würde man sehr viele datensätze einsparen.

Der Plan ist die Disposition von Papier auf digital umzustellen. Was jedoch bis jetzt noch nicht möglich war. Grund ist ganz einfach das bei 40 Touren und 5 disponenten noch kein Programm existierte dies schnell und im Team zu bewerkstelligen. Mit ninox hab ich die Möglichkeit wenn mir dann irgendwann noch was einfällt wie ich das Problem löse, das nur ein Benutzer die jeweilige Filiale disponieren kann. Also benutzer 1 bekommt einen Anruf und will einen Termin für Filiale X machen in dieser Zeit dürfen  natürlich die anderen 4 Mitarbeiter keinen Zugriff auf diese Filiale haben. Sonst hat man im schlimmsten Fall 2 Küchen auf einer Tour am Tag, was natürlich nicht geht.

Aber zurück zur csv. Mein Plan ist über die Suche einen kv aus der Tabelle Kunden zu suchen über Skript mit der tagangabe. Das passt alles. Vor zurück geht auch in den Tagen. Die einzelnen Touren und die bisherige Auslastung wird in Ansichten dargestellt. Will man einen Kunden disponieren geht man in der asicht drauf, jetzt ist man in der tabelle Kunden, hier gibt man nur noch die Tour ein und drückt auf disponieren. Dabei wird der Datensatz in eine neue tabelle geschrieben, in der tabelle Kunden gelöscht und in der Übersicht das Suchfeld sowie Datum auf Null gesetzt. Alle Fenster schließen sich und die Übersicht geht im Vollbild neu auf. 

Die csv kommt jeden Tag und hat darin ein zeitstempel, Datum stehen von wann sie ist. Kann man jetzt eventuell nur die neu dazugekommen,  an den Tagen zuvor noch nicht erreichten Kunden hinzufügen? In der csv sind jeden tag alle disponierbaren kunden enthalten. Gut die Hälfte ist aber schon in der tabelle kunden

 

Ninox Profile

Hab leider gar nichts verstanden. Bei dem csv import kann man auswählen ob man alle Daten hinzufügt oder nur neue. Dabei muss die csv. Datei eine Spalte mit eindeutigen Wert haben. Wenn du dir sicher bist dass die Zeitstempel sich nicht wiederholen, kannst du diese Spalte als Schlüssel festlegen.

Leo

1 2
Antworten