Import csv auswerten
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
11 Antworten
-
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
-
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 )
-
Im Aufbau fehlte noch was
-
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
-
Super!
vielen Dank. Funktioniert so auch nebenbei noch schneller.
-
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 ?
-
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?
-
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
-
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
-
War bischen wirr geschrieben sorry.
Die CSV wird jetzt eingelesen in CSVin und das erste mal komplett in den Pool übertragen. Das dauert über eine Stunde. Am nächsten Tag wird die neue CSV eingelesen mit dem Schlüssel auf Text 3 (KV) jedoch nur neue einträge hinzufügen. Dann werden jedoch nur die neuen Daten mit dem Zeitstempel heute in den Pool eingelesen, das geht relativ zügig:
do as server
for i in (select CSVin)['Text 6' = 1 and Text = format(date(today()), "YYYYMMDD")] do
let myNextId := min((select CSVin)['Text 6' = 1 and number(Nr) > i.number(Nr)].number(Nr));
let new := (create Pool);
new.(KV := i.'Text 9');
new.(Vorname := i.'Text 11');
new.(Name := i.'Text 10');
new.('Straße' := i.'Text 12');
new.(PLZ := i.'Text 14');
new.(Ort := i.'Text 15');
new.(Tele := i.'Text 16');
new.(Mail := i.'Text 36');
new.(VK := i.'Text 31');
new.(Auslieferlager := i.'Text 26');
new.(Anlieferlager := i.'Text 24');
new.(Reklakennzeichen := i.'Text 30');
new.(Lieferkennzeichen := i.'Text 29');
new.(Inhalt := join((select CSVin)[number(Nr) > i.number(Nr) and number(Nr) < myNextId and 'Text 6' = 4 and Text = format(date(today()), "YYYYMMDD")].('Text 16' + 'Text 17' + 'Text 18'), "
"))
end
endWenn man einen Kunden Disponiert wird dieser vom Pool in Disponiert geschrieben und die Daten dazu in der CSVin sowie im Pool gelöscht. (Ist dann auch in der nächsten, neuen CSV nicht dabei):
let me := this;
let KV := me.KV;
for i in (select CSVin)['Text 3' = KV] do
let myNextId := min((select CSVin)['Text 3' = KV and number(Nr) > i.number(Nr)].number(Nr));
delete i;
let new := (create Disponiert);
new.(KV := me.KV);
new.(Name := me.Name);
new.(Filiale := me.Auslieferlager);
closeRecord();
delete me;
(select 'übersicht').(Suchfeld := 0);
openTable("übersicht");
delete this
end--------------------------------------------------------------
Jetzt hab ich nur noch ein Problem,
wie kann ich verhindern das mehrere benutzer gleichzeitig eine Filiale bearbeiten können. Es soll da ein Alert kommen das die Filiale gerade in benutzung ist, sowie die Schreibrechte für die anderen entzogen werden.
Die Tabelle übersicht soll nicht zum Schreiben dienen, nur zum Aufrufen und suchen.
Michi
-
Hat jemand ne idee?
Content aside
- vor 4 JahrenZuletzt aktiv
- 11Antworten
- 1070Ansichten