我有一个用户将文件上传到系统的场景。系统唯一可以在CSV中理解的文件,但用户可以上传任何类型的文件,例如:jpeg,doc,html。如果用户上传CSV文件以外的任何内容,我需要抛出异常。
有人可以告诉我如何找到上传的文件是否为CSV文件?
答案 0 :(得分:7)
CSV文件变化很大,它们都可以合法地称为CSV文件。
我猜你的方法不是最好的方法,正确的方法是判断上传的文件是否是文本文件应用程序可以解析而不是它是否为CSV。
无论何时无法解析文件,都会报告错误,无论是JPG,MP3还是CSV都无法解析。
要做到这一点,我会尝试找一个库来解析各种CSV文件格式,否则你需要很长的路要走编写代码来解析许多可能类型的CSV文件(或者通过支持几种CSV格式来限制应用程序的灵活性。 )
一个这样的Java库是opencsv
答案 1 :(得分:6)
如果您正在使用某些库CSV解析器,那么您所要做的就是捕获它抛出的任何错误。
如果您使用的CSV解析器具有远程可靠性,则在它不理解文件格式的情况下会抛出一些有用的错误。
答案 2 :(得分:0)
我不知道你是否能以任何方式确定100%确定,但我建议第一次验证应该是:
答案 3 :(得分:0)
我可以想到几种方法。
一种方法是尝试使用UTF-8解码文件。 (它内置于Java中,也可能内置于.NET中。)如果文件解码正确,那么您至少知道它是某种文本文件。
一旦您知道它是一个文本文件,就会解析每一行中的各个字段,并检查您是否获得了预期的字段数。如果每行的字段数不一致,那么您可能只有一个包含文本但没有组织成行和字段的文件。
否则您有CSV。然后你可以验证字段。
答案 4 :(得分:0)
如果是Web应用程序,您可能需要检查浏览器在通过表单上传/发布文件时发送的内容类型HTTP标头。
如果你正在使用的语言绑定,你也可以尝试使用libmagic,非常擅长识别文件类型。例如,UNIX工具file
使用它。
答案 5 :(得分:0)
试试这个:
{{1}}
答案 6 :(得分:0)
我这样解决:读取UTF-16编码的文件,如果在文件中找不到逗号,则表示UTF-16编码无效。这意味着该csv文件为Excel格式(不是纯文本)。
if(fileA.endsWith(".csv") && fileB.endsWith(".csv")) {
second_list=readCSVFile(fileA);
new_list=readCSVFile(fileB);
if(!String.join("", second_list).contains(",") || !String.join("", new_list).contains(",")) {
//read these files with UTF-8 encoding
System.out.println("[WARN] csv files will be read like text files. (UTF-16 encoding couldnt find any comma in the file i.e., UTF-16 encoding didn't work)");
second_list=readFile(fileA);
new_list=readFile(fileB);
} else {
// keep the csv as UTF-16 encoded
}