Проверка файла 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, но поврежден на полпути.