2009-03-13 11 views
6

Czytam pliku linia po linii, tak:CSV z 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(); 
} 

Ale jeśli są dodane inne rodzaje plików, to nadal będzie czytać ich zawartość. Na przykład, jeśli przesłany plik jest obrazem, będzie wyświetlał niepotrzebne znaki podczas odczytu pliku. Moje pytanie brzmi: jak mogę sprawdzić plik CSV na pewno przed jego przeczytaniem?

Sprawdzanie rozszerzenia pliku jest trochę lame, ponieważ ktoś może przesłać plik, który nie jest plikiem CSV, ale ma rozszerzenie .csv. Z góry dziękuję.

Odpowiedz

2

Ustalenie typu MIME pliku nie jest łatwe, szczególnie jeśli sekcje ASCII można mieszać z plikami binarnymi.

W rzeczywistości, gdy przyjrzymy się, w jaki sposób system poczty elektronicznej określa typ MIME wiadomości e-mail, wymaga to odczytywania wszystkich bajtów i stosowania pewnych "reguł".
Wyjazd MimeUtility.java

  • Jeśli podstawowy typ tego źródła danych jest „text” i jeśli wszystkie bajty w swoim strumieniu wejściowym są US-ASCII, następnie kodowanie jest „7bit”.
  • Jeśli więcej niż połowa bajtów to nie-US-ASCII, kodowanie to "base64".
  • Jeśli mniej niż połowa bajtów to nie-US-ASCII, kodowanie to "quoted-printable".
  • Jeśli głównym typem tego źródła danych nie jest "tekst", to jeśli wszystkie bajty jego strumienia wejściowego są US-ASCII, kodowanie to "7bit".
  • Jeśli występuje nawet jeden znak spoza US-ASCII, kodowanie to "base64". @return "7bit", "quoted-printable" lub "base64"

Jak wspomniano przez mmyers w usuniętego komentarza, JavaMimeType ma robić to samo, ale:

  • go nie żyje od 2006 roku
  • wymaga to przeczytania całej zawartości!

:

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(); 

Więc ... skoro czytasz całą zawartość pliku tak, można wykorzystać to w celu określenia typu na podstawie tej treści i własnymi regułami.

0

Java Mime Magic może być przydatny. Będzie analizować typy MIME z plików i danych wejściowych. Nie mogę jednak ręczyć za jego funkcjonalność.

This link może dostarczyć dalszych informacji. Zapewnia kilka różnych sposobów określania, jak robić to, co chcesz (lub przynajmniej coś podobnego).

Być może miałbym ochotę napisać coś konkretnego do twojej domeny problemowej. na przykład określanie liczby wartości rozdzielanych przecinkami na linię i odrzucanie, jeśli nie mieści się w pewnych granicach. Następnie podziel na przecinki i przeanalizuj każdy wpis zgodnie z wymaganiami (np. Czy są to duble/floats/valid Strings - i jeśli łańcuchy, jakie kodowanie).Myślę, że być może będziesz musiał to zrobić, ponieważ ktoś może może przesłać plik, który zaczyna się jak plik CSV, ale jest uszkodzony w połowie.