2009-03-13 5 views
6

ich eine Datei Zeile für Zeile zu lesen, wie folgt aus:CSV-Datei Validierung mit Java

FileReader myFile = new FileReader(File file); 
BufferedReader InputFile = new BufferedReader(myFile); 
// Read the first line 
String currentRecord = InputFile.readLine(); 

while(currentRecord != null) { 
     currentRecord = InputFile.readLine(); 
} 

Aber wenn andere Arten von Dateien hochgeladen werden, wird es immer noch deren Inhalt lesen. Zum Beispiel, wenn die hochgeladene Datei ein Bild ist, wird es beim Lesen der Datei Junk-Zeichen ausgeben. Meine Frage ist also: Wie kann ich sichergehen, dass die Datei CSV ist, bevor ich sie lese?

Überprüfen der Erweiterung der Datei ist irgendwie lahm, da jemand eine Datei hochladen kann, die nicht CSV ist, aber eine .csv-Erweiterung hat. Danke im Voraus.

Antwort

2

Das Bestimmen des MIME-Typs einer Datei ist nicht einfach, besonders wenn ASCII-Abschnitte mit binären verknüpft werden können.

Eigentlich, wenn Sie sehen, wie ein Java-Mail-System den MIME-Typ einer E-Mail bestimmt, beinhaltet es das Lesen aller Bytes darin und die Anwendung einiger "Regeln".
Check out MimeUtility.java

  • Wenn der primäre Typ dieser Datenquelle "text" ist und wenn alle Bytes in seinem Eingangsstrom US-ASCII, dann die Codierung "7bit".
  • Wenn mehr als die Hälfte der Bytes nicht US-ASCII sind, dann ist die Codierung "base64".
  • Wenn weniger als die Hälfte der Bytes nicht US-ASCII ist, dann ist die Codierung "quoted-printable".
  • Wenn der primäre Typ dieser Datenquelle nicht "text" ist, dann ist die Codierung "7bit", wenn alle Bytes ihres Eingabestroms US-ASCII sind.
  • Wenn es auch nur ein Nicht-US-ASCII-Zeichen gibt, lautet die Codierung "base64". @return "7bit", "quoted-printable" oder "base64"

Wie in einem gelöschten Kommentar von mmyers erwähnt, wird JavaMimeType soll das Gleiche tun, aber:

  • es ist seit 2006
  • tot es beinhaltet Lesen aller Inhalte!

:

File file = new File("/home/bibi/monfichieratester"); 
InputStream inputStream = new FileInputStream(file); 
ByteArrayOutputStream byteArrayStream = new ByteArrayOutputStream(); 
int readByte; 
while ((readByte = inputStream.read()) != -1) { 
    byteArrayStream.write(readByte); 
} 
String mimetype = ""; 
byte[] bytes = byteArrayStream.toByteArray(); 

MagicMatch m = Magic.getMagicMatch(bytes); 
mimetype = m.getMimeType(); 

Also ... da man sowieso den gesamten Inhalt der Datei lesen, Sie nutzen das nehmen könnte die Art auf, dass der Inhalt und die eigenen Regeln zu bestimmen.

0

Java Mime Magic kann von Nutzen sein. Es analysiert Mime-Typen aus Dateien und Inputstreams. Ich kann jedoch nicht für seine Funktionalität bürgen.

This link kann weitere Informationen liefern. Es bietet verschiedene Möglichkeiten, um zu bestimmen, wie man das macht, was man will (oder zumindest etwas Ähnliches).

Ich wäre vielleicht versucht, etwas zu Ihrer Problemdomäne zu schreiben. z.B. Bestimmen der Anzahl kommagetrennter Werte pro Zeile und Zurückweisen, wenn sie nicht innerhalb bestimmter Grenzen liegt. Dann auf die Kommas teilen und jeden Eintrag gemäß den Anforderungen analysieren (z. B. sind sie Doppel/Floats/gültige Strings - und wenn Strings, welche Codierung).Ich denke, Sie müssen dies möglicherweise tun, da jemand eine Datei hochladen kann, die wie eine CSV startet, aber auf halbem Weg beschädigt ist.