Neu Automatisierter Import TXT zu CSV bzw. TXT automatisierte anpassungen

  • Wenn Ihr uns das erste Mal besucht, lest euch bitte zuerst die Foren-Regeln durch.
28. Mai 2018
55
1
#1
Hallo Zusammen

Wir haben verschiedene Lieferanten welche uns die Artikeldaten sowie Lagerbestände etc. als TXT zukommen lassen.
Das Problem besteht darin, dass die meisten eine für Ihren Shop angepasste TXT ausgeben sprich worin für uns viele Sachen irrelevant sind.
Bei einem Import von über 100'000 Artikeln haben wir festgestellt, dass je schlanker die TXT beim Import ist desto schneller geht es.
Sprich ein Import konnten wir von 3.5h auf 2h reduzieren indem wir Manuel die TXT bearbeitet haben.
Dies möchten wir nun Automatisieren, da wir schon automatisch die Daten herunterladen können und mit der Ameise ja importieren.

Jemand eine Idee wie wir automatisiert die TXT Daten anpassen können?
Uns wäre eine kostenlose Lösung am Sympatisten :)

Vielen Dank.

Liebe Grüsse
 

lj-shadow

Gut bekanntes Mitglied
15. März 2013
323
17
#2
Ich mach das auf 'ner virtuellen Linux Maschine mit der Shell per Script.
5x täglich daten holen, anpassen und in einem netzwerkshare bereit stellen.
Teilweise geht das so gut, dass einige importe vollautomatisch laufen können.
Je nachdem wie die Datei aussieht, geht das recht fix.
 

_simone_

Sehr aktives Mitglied
17. Februar 2013
2.409
144
Emsland
#4
Automatisiert bearbeiten ist auch gut mit DOS-Batch-Skript möglich; gerade bei CSV/TXT.
Da müsste man kein Linux installieren, wenn man es nicht kennt.
 

lj-shadow

Gut bekanntes Mitglied
15. März 2013
323
17
#7
Ohh...
Auf einmal bewegung hier...

Linux hatte ich aus 2 Gründen genommen:

A: Der Server läuft damit -> ist also schon da...
B: Wollte es lernen - zumindest mir selbst helfen zu können

Die Virtuelle Maschine hat sich dann später ergeben, damit das nicht mehr der Webserver macht sonder hier im LAN direkt verfügbar ist.

Zum Spalten löschen...
Stell dir vor, Du hast 'ne CSV mit Spaltentrenner ; (Semikolon) und 20 Spalten.
Spalte 1 ist die Artikelnummer, gefolgt von 19 Spalten.

Du Brauchst aber nur Spalte 1 (für die Ameise zum erkennen) und zb. die Lagermenge Deines Lieferanten in Spalte 17.
Dann sieht unter Linux (zB Ubuntu/Debian) Dein Befehl so aus:

Code:
cut -d\; -f1,17 ./datei_vom_lieferanten.csv > lagermenge.csv
Hier wird die Datei "datei_vom_lieferanten.csv" eingelesen, alles ausser Spalte 1 und 17 entfernt und als Datei "lagermenge.csv" gespeichert


EDIT:
awk bzw. gawk leisten auch sehr gute Dienste und sind speziell für solche Fälle da
 
Zuletzt bearbeitet:

lj-shadow

Gut bekanntes Mitglied
15. März 2013
323
17
#9
Noch was hierzu:
Wie ist das Skript? Ich habe bislang nicht wirklich mit Linux gearbeitet :)
Es gibt da - soweit ich weiß - kein "fertiges" Script. Das musst du dir selber schreiben. Geht aber mit Linux Bordmitteln. Immer Excel nervt halt, wenn es immer die gleiche Arbeit ist.
Mittlerweile bin ich bei > 48.000 kB - wobei die Hälfte sicher Doku ist
Mit etwas Zeit und Interesse daran, macht das sogar richtig Spaß - vor allem, wenn man dann die Ergebnisse sieht und die (fast) perfekt laufen.
 
28. Mai 2018
55
1
#10
Heyho

Danke für die Ideen.
ich habe es jetzt mal so gemacht:


set "txt=ArtikelPreisdatenV2.txt"
set "temp= WAWI.txt"
for /f "tokens=1-24 delims= " %%a in (%txt%) do echo %%a %%c %%j %%k %%M >> %temp%

Unter Windows, aber irgendwie stimmt es noch nicht so ganz.
Es übernimmt teilweise noch immer falsche Spalten.. :-/ zugleich sind falsche Spalten (also welche ich benötige) nicht mehr vorhanden.
 

lj-shadow

Gut bekanntes Mitglied
15. März 2013
323
17
#11
Hast du ein Leerzeichen als Trenner?

Edit:
Wenn dem so ist, würde ich vermuten, dass ein/mehrere "Spalten" deiner CSV/Textdatei einen Wert enthalten, der ein Leerzeichen enthält.
Somit erkennt die Schleife im Batchfile die falsche Stelle und zerhackt dir das Ergebnis.

Zweite Vermutung / Noch was zu "Leerzeichen":
Ich habe bei 2 Dateien, die ich bekomme, NULL-Chars drin. Die "sieht" man nicht, wenn man mit dem Windows Editor die Datei öffnet.
Schau mal in die Datei mit Notepad++ rein (Option "Nicht sichtbare Zeichen anzeigen" muss aktiv sein). Dann erkennst Du ob die drin sind.
Wenn ja, kann es Dir passieren, dass Dein Batch an dieser/diesen Stelle/n aus dem Tritt kommt. Falls dies der Fall ist, muss du die VOR der oben genannten Schleife entfernen.
 
Zuletzt bearbeitet:
28. Mai 2018
55
1
#12
Vielen Dank für den Hinweis.
Aktuell habe ich das Skript so verändert:


set "txt=ArtikelPreisdatenV2.txt"
set "temp= WAWI.csv"
for /f "tokens=1-24 delims= " %%a in (%txt%) do echo %%a %%c %%j %%k %%m >> %temp%

Ich habe 3 Änderungen in diesem sinne gemacht:
1. Ausgabe Datei in eine CSV umgewandelt (Da bei TXT alles in eine Spalte fällt)
2. Der abstand ist gemäss Notepad nicht ein Abstand sondern ähnlich wie ein "Tapstop" - übernimmt er hier leider nicht im Forum
3. das für die Spalte m von gross auf klein geändert, da er sonst immer %M auf jede Linie geschrieben hatte.

Jetzt habe ich jedoch festgestellt, dass er nicht mehr sauber Trennt und manchmal endet alles in einer Spalte, dann wieder aufgeteilt usw.
Kann man ihm irgendwie noch mitteilen, dass er den "Tapstop" durch ein ; ersetzten soll?

Vielen Dank!

PS:
Gemäss Notepad ist jede Zeile nun mit einem CR LF fertig.. Keine Ahnung ob so etwas relevant ist.


EDIT:
So habe es nun mit einem VBS Skript weiter bekommen:
VBS Skript:
Set objFSO = CreateObject("Scripting.FileSystemObject")
Const ForReading = 1
Const ForWriting = 2
' Datei öffnen und Text einlesen und schließen
Set objFile = objFSO.OpenTextFile("ArtikelPreisdatenV2.txt", ForReading)
strText = objFile.ReadAll
objFile.Close
' Änderungen am Inhalt
strNewText = Replace(strText, " ", ";")
strNewText = Replace(strNewText, " ", ";")
' Neue Datei erstellen mit neuen Inhalten füllen
set resultFile = objFSO.CreateTextFile("temp.txt", true)
resultFile.WriteLine strNewText
resultFile.Close

Batch:
entfernen.vbs
set "temp=temp.txt"
echo Output File Setzen
set "output=wawiimport.txt
for /f "tokens=1-24 delims=;" %%a in (%temp%) do echo %%a %%c %%j %%k %%m >> %output%


Nun die Problematik:
Er setzt ersetzt jetzt den "Tapstop" korrekt durch ein ; jedoch im zweiten schritt (in welchem jetzt die spalten stimmen würden) entfernt er beim entfernen der Spalten auch gleich wieder das ;

Selbst wenn ich versuche im ersten schritt mit , zu arbeiten, wird mir ein "Tapstop" wieder eingefügt und die Datei "einfach durchgegeben"

Habt ihr noch weitere Ideen?
 
Zuletzt bearbeitet:

lj-shadow

Gut bekanntes Mitglied
15. März 2013
323
17
#13
Hmmm...
Versuche mal deinen obersten Ansatz ohne das Script noch mal so:

...delims=\t"
(Sorry, einfügen ging mit Handy gerade nicht)...

Also ohne es vorher auf semikolon zu ändern.
Bei Windows weiß ich da leider sonst nicht weiter. Bei Linux bin ich da wohl schon eingespielter
 
Zuletzt bearbeitet:
28. Mai 2018
55
1
#14
Wenn ich mit dem t mache, öffnet sich bei mir die batch gar nicht mehr.. :(

Habe es jetzt mal so hinbekommen:
VBS:
Set objFSO = CreateObject("Scripting.FileSystemObject")
Const ForReading = 1
Const ForWriting = 2
' Datei öffnen und Text einlesen und schließen
Set objFile = objFSO.OpenTextFile("ArtikelPreisdatenV2.txt", ForReading)
strText = objFile.ReadAll
objFile.Close
' Änderungen am Inhalt
strNewText = Replace(strText, " ", ";,")
strNewText = Replace(strNewText, " ", ";,")
' Neue Datei erstellen mit neuen Inhalten füllen
set resultFile = objFSO.CreateTextFile("temp.txt", true)
resultFile.WriteLine strNewText
resultFile.Close

(hierbei setze ich ja ein ; und ein ,

Skript:
set "temp=temp.txt"
set "output=nochmalbearbeiten.txt
entfernen.vbs
for /f "tokens=1-24 delims=," %%a in (%temp%) do echo %%a %%c %%j %%k %%m >> %output%

wobei das Endergebnis jetzt mit ; getrennt ist (welches ich wollte) jedoch noch immer die Problematik besteht, dass nicht alle Zeilen korrekt zur Spalte stimmt..

Nochmal eine Idee? :)
 

lj-shadow

Gut bekanntes Mitglied
15. März 2013
323
17
#15
Ehrlich gesagt, nein.
Ich wäre noch immer bei der Vermutung, dass irgendwo in den "gewollten Daten" ein Zeichen bei ist, dass als trenner genutzt wird. Bei dem replace änderst du es ja mit und nimmst den Fehler mit.

Das \t definiert unter Linux den tab...
Du könntest mal nachsehen, wie der unter Windows erkannt wird.
Möglichkeiten wären zb:

<TAB>
%TAB%
`t

Die könntest du statt dem \t noch probieren.