Проверка файла CSV с помощью 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();
 }

Но если загружены другие типы файлов, он все равно будет читать их содержимое. Например, если загруженный файл является изображением, он будет выводить ненужные символы при чтении файла. Итак, мой вопрос: как я могу проверить файл CSV наверняка, прежде чем читать его?

Проверка расширения файла является неубедительной, поскольку кто-то может загрузить файл, который не является CSV, но имеет расширение.csv. Заранее спасибо.

2 ответа

Определить MIME-тип файла непросто, особенно если разделы ASCII можно смешивать с двоичными.

На самом деле, когда вы смотрите, как система java mail определяет тип MIME электронной почты, она включает в себя чтение всех байтов в ней и применение некоторых "правил".
Проверьте MimeUtility.java

  • Если основным типом этого источника данных является "текст" и если все байты в его входном потоке являются US-ASCII, то кодировка "7 бит".
  • Если более половины байтов не-US-ASCII, то кодировка "base64".
  • Если менее половины байтов не-US-ASCII, то кодировка "цитируемая для печати".
  • Если основной тип этого источника данных не "текст", то, если все байты его входного потока являются US-ASCII, кодировка "7 бит".
  • Если есть хотя бы один символ, отличный от US-ASCII, кодировка "base64". @return "7bit", "quoted-printable" или "base64"

Как упомянуто Michael Myers в удаленном комментарии, JavaMimeType должен делать то же самое, но:

  • он мертв с 2006 года
  • это включает в себя чтение всего контента!

:

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

Итак... поскольку вы все равно читаете все содержимое файла, вы можете воспользоваться этим, чтобы определить тип на основе этого содержимого и ваших собственных правил.

Java Mime Magic может пригодиться. Он будет анализировать MIME-типы из файлов и входных потоков. Однако я не могу поручиться за его функциональность.

Эта ссылка может предоставить дополнительную информацию. Он предоставляет несколько разных способов определения того, как делать то, что вы хотите (или, по крайней мере, что-то подобное).

Возможно, мне хотелось бы написать что-то конкретное для вашей проблемной области. например, определение количества значений через строку, разделенных запятыми, и отклонение, если оно не находится в определенных пределах. Затем разделите запятые и проанализируйте каждую запись в соответствии с требованиями (например, являются ли они double / float / valid Strings - и, если строки, то какая кодировка). Я думаю, что вам, возможно, придется сделать это в любом случае, учитывая, что кто-то может загрузить файл, который начинается как CSV, но поврежден на полпути.

Другие вопросы по тегам