Проверка файла CSV с помощью Java - PullRequest
6 голосов
/ 13 марта 2009

Я читаю файл построчно, например:

 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 ]

2 голосов
/ 14 марта 2009

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

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

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

Как упомянуто mmyers в удаленном комментарии, 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();

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

0 голосов
/ 14 марта 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...