Überprüfen Sie die CSV-gegen bestimmtes format
Warte ich auf den upload einer CSV-Datei, maximale Größe 1MB zu einem web-Formular, das passen sollte ein bestimmtes format ähnlich:
"<String>","<String>",<Int>,<Float>
Werden später verarbeitet. Ich möchte, um zu überprüfen, die Datei passt zu einem festgelegten format, so dass das Programm ein, der später verwenden Sie die Datei nicht erhalten unerwartete Eingabe, und dass es keine Sicherheitsbedenken (sagen einige-injection-Angriff gegen das parsing Skript, das macht einige Berechnungen und db-insert).
(1) Was wäre der beste Weg zu gehen über das tun dies, wäre eine schnelle und Gründliche? Von dem, was ich recherchiert hab, konnte ich gehen den Weg von regex oder etwas mehr wie diese. Ich habe die python csv Modul aber nicht erscheint, alle integrierten in die Prüfung.
(2) Angenommen, ich gehe für eine regex, kann jemand mich direkt auf in Richtung der beste Weg, dies zu tun? Ich Spiel für illegale Zeichen, und weist auf, dass? (zB. kein '/' '\' '<' '>' '{' '}' usw.) oder passen auf alle gesetzlichen zB. [a-zA-Z0-9]{1,10} für die string-Komponente? Ich bin nicht allzu vertraut mit regulären Ausdrücken, so dass die Zeiger oder Beispiele würde sehr geschätzt.
BEARBEITEN:
Sollten Strings enthalten keine Kommas oder Anführungszeichen, es würde nur einen Namen enthalten (dh. first name, last name). Und ja, ich vergaß hinzuzufügen, Sie wäre in doppelte Anführungszeichen gesetzt.
EDIT #2:
Danke für die vielen Antworten. Cutplace ist sehr interessant aber ist ein standalone. Beschlossen zu gehen mit pyparsing in das Ende, denn es gibt mehr Flexibilität, sollte ich hinzufügen, mehr Formate.
- was würde Ihr format für strings, die Kommas enthalten (string sollte das doppelte Anführungszeichen)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Pyparsing verarbeiten diese Daten, und seien Sie tolerant gegenüber unerwarteten Dinge wie Leerzeichen vor und nach den Kommas, Kommas innerhalb der Anführungszeichen, etc. (csv-Modul zu, aber regex-Lösungen, die Sie zwingen, sich zu fügen "\s*" - bits alle über dem Platz).
Drucke
Werden Sie wahrscheinlich Strippen diese Anführungszeichen aus-irgendwann in der Zukunft, pyparsing können tun, dass auf den parse-Zeit, indem Sie:
Wenn Sie möchten, fügen Sie Kommentar Unterstützung, um Ihre input-Datei, sprich ein '#' gefolgt von dem rest der Zeile, können Sie dies tun:
Sie können auch eigene Bezeichnungen für diese Felder, so dass Sie können Sie mit Namen statt index-position (die ich finden gibt robusteren code im Lichte von Veränderungen an der Straße):
- Und Ihre post-processing-code kann dann so machen:
Ich würde Stimmen für die Analyse der Datei, die überprüfung, du hast 4 Komponenten pro Datensatz, dass die ersten zwei Komponenten sind die Saiten, der Dritte ist ein int (Prüfung nach NaN-Bedingungen), und das vierte ist ein frei (auch die überprüfung nach NaN-Bedingungen).
Python wäre ein hervorragendes Werkzeug für den job.
Ich bin mir nicht bewusst, irgendwelche Bibliotheken in Python befassen sich mit der Validierung der CSV-Dateien gegen eine Skillung, aber es wirklich sollte nicht allzu schwer zu schreiben.
Hier ist ein kleines snippet, den ich gemacht:
Wenn Sie ausführen, dass eine Datei nicht das format Ihres angegeben haben, erhalten Sie eine Ausnahme:
Können Sie dann eine try-except ValueError, um Sie zu fangen und lassen Sie die Benutzer wissen, was Sie falsch gemacht haben.
Kann es eine Menge von corner-cases für das Parsen von CSV, so dass Sie wahrscheinlich nicht wollen, um zu versuchen, es zu tun "von hand". Zumindest beginnen mit einem package/Bibliothek eingebaut, um die Sprache, die Sie verwenden, auch wenn es nicht alle tun, die den "Nachweis" können Sie denken.
Sobald Sie dort sind, überprüfen Sie dann die Felder für die Liste der "illegalen" chars, oder überprüfen Sie die Werte in jedem Feld bestimmen Sie gültig sind (wenn Sie dies tun können). Sie auch brauchen nicht einmal einen regex für diese Aufgabe unbedingt, aber es kann übersichtlicher es so zu tun.
Könnte man auch verbieten embedded \r oder \n, \0 oder \t. Einfach eine Schleife durch die Felder und überprüfen Sie Sie, nachdem Sie geladen haben, werden die Daten mit der csv-lib.
Versuchen Cutplace. Es wird überprüft, ob tabluar Daten entspricht eine interface control document.
Ideal, Sie möchten, dass Ihre Filterung, um so restriktiv wie möglich - die weniger Dinge, die Sie erlauben, desto weniger potenzielle Möglichkeiten des Angriffs. Zum Beispiel eine float-oder int-Feld hat nur eine sehr kleine Anzahl von Zeichen (und nur sehr wenige Konfigurationen der Charaktere), die sollte eigentlich erlaubt sein. String filtern sollte im Idealfall nur das, was Zeichen, die Menschen hätten einen Grund, um input -, ohne zu wissen, den größeren Kontext, es ist schwer zu sagen Ihnen genau, welche Sie erlauben sollten, aber auf ein minimum reduzieren die string-match regex benötigen sollte Quotierung von Zeichenketten und verbieten, würde alles, was die Zeichenkette beenden früh.
Halten Sie im Verstand, jedoch, dass einige Namen enthalten können Dinge wie single quotes ("O ' Neil", zum Beispiel) oder Bindestriche, also konnten Sie nicht unbedingt die Regel aus.
Etwas wie...
...wäre wahrscheinlich ideal für double-quoted strings, welche sollen enthalten Namen. Sie ersetzen könnten die
+
mit einem{x,y}
Länge min/max, wenn Sie wollte durchsetzen, bestimmte Längen sowie.