Как узнать, является ли файл файлом CSV? - PullRequest
1 голос
/ 18 июня 2010

У меня есть сценарий, в котором пользователь загружает файл в систему.Единственный файл, который система понимает в CSV, но пользователь может загрузить любой тип файла, например: jpeg, doc, html.Мне нужно сгенерировать исключение, если пользователь загружает что-то, кроме файла CSV.

Может кто-нибудь сообщить мне, как я могу найти, является ли загруженный файл файлом CSV или нет?

Ответы [ 7 ]

7 голосов
/ 18 июня 2010

CSV-файлы сильно различаются, и все они могут быть законно названы CSV-файлами.

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

Вы будете сообщать об ошибках всякий раз, когда вы не можете разобрать файл, будь то JPG, MP3 или CSV вформат, который вы не можете анализировать.

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

Одна из таких библиотек для Java - opencsv

6 голосов
/ 18 июня 2010

Если вы используете какой-то библиотечный анализатор CSV, все, что вам нужно сделать, это перехватить все ошибки, которые он выдает.

Если анализатор CSV, который вы используете, удаленно устойчив, он выдаст несколько полезных ошибок в случае, если он не понимает формат файла.

0 голосов
/ 26 февраля 2019

Я решил это так: прочитайте файл с кодировкой 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
                }
0 голосов
/ 10 октября 2016

попробуйте это:

String type = Files.probeContentType(Paths.get(filepath));
0 голосов
/ 18 июня 2010

Если это веб-приложение, вы можете проверить HTTP-заголовок типа содержимого, который браузер отправляет при загрузке / публикации файла через форму.Если есть привязка к языку, который вы используете, вы также можете попробовать использовать libmagic, довольно хорошо распознает типы файлов.Например, инструмент UNIX file использует его.

http://sourceforge.net/projects/libmagic/

0 голосов
/ 18 июня 2010

Я могу придумать несколько методов.

Один из способов - попытаться декодировать файл с использованием UTF-8. (Это встроено в Java и, вероятно, также в .NET.) Если файл декодируется правильно, вы, по крайней мере, знаете, что это какой-то текстовый файл.

Как только вы узнаете, что это текстовый файл, проанализируйте отдельные поля в каждой строке и убедитесь, что вы получили ожидаемое количество полей. Если количество полей в строке не согласовано, возможно, у вас просто есть файл, содержащий текст, но не организованный в строки и поля.

В противном случае у вас есть CSV. Затем вы можете проверить поля.

0 голосов
/ 18 июня 2010

Я не знаю, можете ли вы на 100% сказать наверняка, но я бы посоветовал, чтобы первые проверки были:

  1. Это расширение файла .csv
  2. Подсчитайте количество запятых в файле на строку, обычно в каждой строке файла должно быть одинаковое количество запятых, чтобы он был действительным файлом CSV.(Как сказал Jkramer, это работает, только если файлы не могут содержать запятые в кавычках).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...