PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Datei modifizieren: Programm schreiben oder Script erstellen?


DerRob
2011-02-05, 00:31:00
Ich will/muss demnächst eine Möglichkeit finden, um folgende Aufgaben möglichst weit automatisiert auszuführen:

- Eine Tabelle (CSV-Datei) von einem FTP-Server laden
- bestimmte Einträge anhand vorgegebener Kriterien (evtl. über eine GUI oder Config-Datei modifizierbar) übernehmen, bzw. den Rest löschen
- Felder in der Tabelle umsortieren und Einträge ergänzen/modifizieren
- wieder als CSV-Datei speichern, bzw. evtl. auf einen anderen FTP/Webserver hochladen

Mit welchen Programmen/Programmier- oder Skript-Sprachen wäre sowas (für mich) recht einfach möglich? Ich kenne mich recht gut mit Batch-Programmierung aus, habe grundlegende Erfahrung mit (Visual) Basic (die letzten kleinen Programme sind allerdings schon ein paar Jahre her), und verstehe zwar einigermaßen den Code diverser anderer Sprachen, wüsste allerdings nicht, wie ich selbst zu einem lauffähigen Programm komme.

Hoffnungslos? Oder hat jemand eine Empfehlung, wo dran ich mich mal probieren könnte?

Der_Donnervogel
2011-02-06, 20:13:20
Das kommt auch noch auf andere Sachen drauf an. z.B. Wie lange soll die Lösung eingesetzt werden? Wie komplex sind die Kriterien?

Wenn ich mir das mit den Kenntnissen so ansehe wäre vielleicht eine Idee sich Excel anzusehen. Man kann dort ja mit Visual Basic Makros schreiben und Excel unterstützt die Verarbeitung von CSV-Dateien und es hat einen sehr mächtigen Funktionsumfang. Auch Zugriff auf FTP sollte gehen.

DerRob
2011-02-06, 20:59:42
Das kommt auch noch auf andere Sachen drauf an. z.B. Wie lange soll die Lösung eingesetzt werden? Wie komplex sind die Kriterien?
Das sollte schon über einen längeren Zeitraum gehen. Es geht darum, eine Artikelliste vom Lieferanten abzuholen, mehrere Artikel anhand der Warengruppen herauszufiltern, ein paar Spalten umzusortieren, und dann in unserem Webshop wieder hochzuladen. Das ganze müsste mindestens 1-2 mal pro Woche gemacht werden, ideal wäre es, wenn das vollautomatisch funktionieren würde (wobei ich nicht genau weiß, ob sich das hochladen so einfach automatisieren lässt, bisher wird das per Hand über ein Web-UI gemacht, CSV hochladen, Warengruppe selektieren, CSV in diese Warengruppe einspielen).

Wenn ich mir das mit den Kenntnissen so ansehe wäre vielleicht eine Idee sich Excel anzusehen. Man kann dort ja mit Visual Basic Makros schreiben und Excel unterstützt die Verarbeitung von CSV-Dateien und es hat einen sehr mächtigen Funktionsumfang. Auch Zugriff auf FTP sollte gehen.
Aber das mit Excel wäre schonmal ein guter Anfang, bisher haben wir das Umsortieren per Hand in Excel gemacht, aber das ist auf Dauer recht zeitaufwändig und auch ziemlich fehleranfällig.

Gast
2011-02-07, 21:44:20
Ich würde da ein Skript nehmen.
Gerade bei solchen Aufgaben werden die Anforderungen gern mal geändert oder neue Sonderfälle eingeführt und und und

Mit einem Skript bleibt man da leichter "am Ball", weil man sich das Kompilieren spart, Debug-Ausgaben leichter zu machen sind etc.

Falls da ein Linux/Unix zum Einsatz kommt, kannst das Skript gleich mit RCS versionieren, dann geht nix verloren.
Als Sprache bietet sich Perl oder Python an, vll noch andere... unter Windows vll auch PowerShell ,aber da kenn ich mich nicht aus.

Gast
2011-02-07, 22:39:28
Mhh...vor Allem das Fehlerhandling dürfte mit den bekannten Batchmöglichkeiten äußert defizil werden. Man käme mit den optimierten und erprobten (String-)Routinen etablierter Bibliotheken sicherlich weiteraus effizienter und schneller ans Ziel. Nur dafür sollte man schon programmieren können :)

Wäre aber nett wenn Du - sofern irgendwann fertog - deinen CVS-Parser aus Batchbefehlen posten könntest...

RattuS
2011-02-08, 02:24:39
Excel mit VBA. Dank Excel kannst du mühelos mit der CVS arbeiten ohne vorher noch zusätzlich und vor allem fehleranfällig zu Parsen. Außerdem hast du grundlegende Filter-, Sortierungs- und Gruppierungsmöglichkeiten.

Als ich in der EDV eines großen Krankenhauses gearbeitet habe, hatte ich für einen Kollegen auch so ein kleines Automtisierungstool geschrieben, das Tabellen eingelesen, nach angegebenen Kriterien gefiltert, anschließend Duplikate entfernt hat und eine neue gesäuberte Tabelle exportiert hat. Die Leute haben nicht gerade schlecht gestaunt, wie viel Zeit man damit sparen kann. ;)

Gnafoo
2011-02-08, 03:58:46
Ich persönlich würde das ja mit C# machen, mag aber auch daran liegen, dass ich damit schlicht am besten vertraut bin. VB.NET oder PowerShell gehen sicher auch (wobei ich mir nicht sicher bin, wie gut sich mit PowerShell auf den Daten arbeiten lässt, ich habs nie verwendet).

Dann würde ich mir eine nette Open-Source FTP-Library suchen (sowas (http://ftplib.codeplex.com/) zum Beispiel, Google spuckt aber noch mehr aus), die Datei temporär herunterladen und entweder mit einer weiteren Library oder TextFieldParser (http://stackoverflow.com/questions/1898/csv-file-imports-in-net) aus dem Framework parsen. Ein eigener Parser kann ganz schnell über diverse Eigenarten stolpern (sowas wie ",x" oder "a""b"), außerdem macht es mehr Arbeit. Da mit string.Split() o. ä. dranzugehen dürfte daher nicht sehr empfehlenswert sein.

Je nach Anforderung kann man die Daten dann in richtige Strukturen oder eine einfache List<string[]> einlesen und bearbeiten. So etwas wie Sortieren ist in C# mit LINQ kein großes Thema. Eine GUI ließe sich auch vergleichsweise einfach basteln und die Ausgabe als CSV ist an sich auch kein großes Problem (definitiv einfacher als das Parsen).

Dennoch setzt das natürlich eine gewisse Programmierkenntnis voraus. Mag sein, dass Excel/VBA da besser abschneidet. Ob es sich ohne großes Vorwissen auch so gut automatisieren lässt und dabei einfacher ist, weiß ich nicht genau. Allzu groß kann der Unterschied aber auch nicht sein. Im Endeffekt wird es auf etwas ähnliches hinauslaufen, bloß in VBA mit Excel-Funktionen statt Libraries.

Berni
2011-02-09, 01:11:18
Auf Linux (Windows sollte analog gehen denn es gibt wohl auch wget/wput für Windows) kann man das leicht mit einem kleinen Bashscript realisieren:
1. Per wget die Datei holen
2. MySQL-Operationen ausführen per MySQL-Script:
2.1 In MySQL-Datenbank laden (Stichwort "LOAD DATA INFILE")
2.2 Sätze löschen anhand der Kriterien, die in einer Kriterientabelle gespeichert sind (diese Kriterien sind durch den Anwender per PHP-Script änderbar)
2.3 Wieder exportieren (Stichwort "SELECT INTO OUTFILE")
3. Per wput das Ganze irgendwo hochladen.

Die einzige richtige Programmierarbeit wäre dann die Oberfläche für die Ausnahmen per PHP zu bauen (evtl. reicht dafür auch phpmyadmin?).

RattuS
2011-02-09, 02:54:38
Auf Linux (Windows sollte analog gehen denn es gibt wohl auch wget/wput für Windows) kann man das leicht mit einem kleinen Bashscript realisieren:
1. Per wget die Datei holen
2. MySQL-Operationen ausführen per MySQL-Script:
2.1 In MySQL-Datenbank laden (Stichwort "LOAD DATA INFILE")
2.2 Sätze löschen anhand der Kriterien, die in einer Kriterientabelle gespeichert sind (diese Kriterien sind durch den Anwender per PHP-Script änderbar)
2.3 Wieder exportieren (Stichwort "SELECT INTO OUTFILE")
3. Per wput das Ganze irgendwo hochladen.

Die einzige richtige Programmierarbeit wäre dann die Oberfläche für die Ausnahmen per PHP zu bauen (evtl. reicht dafür auch phpmyadmin?).
Das setzt aber einen DB-Server voraus (und einen Webserver oder zumindest eine andere Art des PHP-Handlings). Wenn ich das richtig sehe, hat der TS die nicht. Es geht hier wohl nur um die Verarbeitung von CSV-Dateien.

DerRob
2011-02-09, 09:35:59
Vielen Dank schonmal für die Tips.

Es ist ein Windows 2003 Server vorhanden (auf dem auch MySQL läuft), allerdings habe ich von PHP/MySQL leider noch überhaupt keine Ahnung.

Ich werde mich wohl erstmal mit Excel beschäftigen, und das Stück für Stück automatisieren. Es reicht ja erstmal, wenn das Umsortieren/Ausfiltern automatisch geht, das hoch/runterladen der Datei ist ja nicht so (Zeit-)aufwändig oder fehleranfällig.

Limit
2011-02-16, 23:58:58
Also ich würde Python benutzen (und das sage ich nicht, weil es zur Zeit meine Lieblingssprache ist). In der Standard-Bibliothek sind entsprechende Funktionen für FTP und csv schon enthalten, so dass du für das runterladen + parsen der csv nur ganz wenige Zeilen brauchst. Anschließend kannst du die Daten entweder direkt in Python manipulieren oder sie in eine sqlite Datenbank (ist in einem Python-Modul aus der Standardbibliothek integriert) übertragen und dann da per sql manipulieren.

Im einfachsten Fall hättest du mit dem unten stehenden Code schon das ganze Gerüst für dein Programm.


import csv
import urllib2

outfile = open("result.csv", "w")
infile = urllib2.urlopen("ftp://ftp.bla.de/test.csv")

table = csv.reader(infile)
csvOut = csv.writer(outfile)

for row in table:
newRow = machIrgendwasMitDerZeile(row)
csvOut.writerow(newRow)

outfile.close()
infile.close()