使用Java验证CSV文件

7 java csv validation

我正在逐行读取文件,如下所示:

 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();
 }
Run Code Online (Sandbox Code Playgroud)

但是,如果上传其他类型的文件,它仍将读取其内容.例如,如果上传的文件是图像,则在读取文件时将输出垃圾字符.所以我的问题是:如何在阅读之前检查文件是否为CSV?

检查文件的扩展名有点蹩脚,因为有人可以上传非CSV但扩展名为.csv的文件.提前致谢.

Von*_*onC 2

确定文件的 MIME 类型并不是一件容易的事,特别是当 ASCII 部分可以与二进制部分混合时。

实际上,当您查看 java 邮件系统如何确定电子邮件的 MIME 类型时,它确实涉及读取其中的所有字节,并应用一些“规则”。
查看MimeUtility.java

  • 如果此数据源的主要类型是“文本”并且其输入流中的所有字节都是 US-ASCII,则编码为“7 位”。
  • 如果超过一半的字节是非 US-ASCII,则编码为“base64”。
  • 如果少于一半的字节是非 US-ASCII,则编码是“quoted-printable”。
  • 如果该数据源的主要类型不是“text”,那么如果其输入流的所有字节都是US-ASCII,则编码为“7bit”。
  • 即使有一个非 US-ASCII 字符,编码也是“base64”。 @return“7bit”、“引用打印”或“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();
Run Code Online (Sandbox Code Playgroud)

所以...既然您正在阅读文件的所有内容,您可以利用它来根据该内容和您自己的规则来确定类型。