使用Java验证CSV文件

时间:2009-03-13 20:38:10

标签: java validation csv

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

 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 个答案:

答案 0 :(得分:2)

确定文件的MIME类型并不容易,特别是如果ASCII部分可以与二进制部分混合使用。

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

  
      
  • 如果此数据源的主要类型是“text”,并且如果其输入流中的所有字节都是US-ASCII,则编码为“7bit”。
  •   
  • 如果超过一半的字节是非US-ASCII,则编码为“base64”。
  •   
  • 如果少于一半的字节是非US-ASCII,则编码为“quoted-printable”。
  •   
  • 如果此数据源的主要类型不是“text”,那么如果其输入流的所有字节都是US-ASCII,则编码为“7bit”。
  •   
  • 如果甚至有一个非US-ASCII字符,则编码为“base64”。   @return“7bit”,“quoted-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();

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

答案 1 :(得分:0)

Java Mime Magic可能有用。它将从文件和输入流中分析mime类型。但是,我不能保证它的功能。

This link可能会提供更多信息。它提供了几种不同的方法来确定如何做你想要的(或至少类似的东西)。

我可能会想要写一些特定于您的问题域的内容。例如确定每行的逗号分隔值的数量,如果不在某些限制范围内则拒绝。然后在逗号上拆分并根据要求解析每个条目(例如,它们是双精度/浮点数/有效字符串 - 如果是字符串,则是什么编码)。我认为你可能不得不这样做,因为有人可能上传一个像CSV一样但在中途被破坏的文件。