【问题标题】:how to validate a file is Proper CSV or not in .net core?如何验证文件在 .net 核心中是否为正确的 CSV?
【发布时间】:2021-01-29 06:04:44
【问题描述】:

我有一个以 IFormFile 形式接收 CSV 文件的 APi。我必须检查发送的文件是否是正确的 CS 文件。所以我正在做以下检查。

  1. 检查文件扩展名。
  2. 检查文件内容类型。

问题:- 如果任何应用程序将使用 API,则可以更改文件扩展名以及内容类型。那么如何验证正确的 CSV 文件呢?到目前为止,我没有收到任何有用的文章。

例如PDF 文件可以更改为 .CSV(扩展名)文件及其内容类型。但 PDF 文件不是有效的 CSV

注意:- 幻数是 .XLSX、.docx、.pdf 等的过程之一。但对于 CSV,它不适用,尝试相同但失败。还有什么方法可以查吗?

【问题讨论】:

  • 定义“正确的 CSV” - 你是指 RFC 4180 吗?
  • 可以将 PDF 文件及其内容类型更改为 .CSV(扩展名)文件。但 PDF 文件不是有效的 CSV
  • Define "Valid CSV" is a,s,d a valid csv?
  • 是的,它是一个有效的 CSV。我不关心数据。它主要与文件类型有关。通过以上 2 项检查,用户可以通过更改文件扩展名和内容类型轻松绕过验证检查。
  • 所以基本上你只关心它是否是一个包含文本的文件?分隔符和列数无关?

标签: c# asp.net-core asp.net-core-webapi


【解决方案1】:

你能得到的最接近的是一个健壮的TryParse 方法。

但与其重新发明轮子,不如先尝试几个库,他们可能会完成这项工作:

https://github.com/TinyCsvParser/TinyCsvParser

https://github.com/nreco/csv

请注意,CSV 解析可以是 a difficult task,即使它是一种简单格式。

即使你不能使用图书馆,你也可以从中获得很多想法。

如果我要检测 CSV 内容,我会执行以下操作:

  • 确保一行包含可读个字符
    • 选择性地检测文件编码可能会有所帮助
  • 确保一行不要太长,否则很可能是二进制,请参阅#1
  • 检测到第一行有重复分隔符
  • 尝试解析行

差不多这样:

  • 找到 CR/LF 或 LF 的第一个索引
  • 仔细阅读
  • 在其中找到分隔符
  • 尝试解析文件的其余部分,检查列数
    • 如果失败则可能不是 CSV

这几乎是所有你可以尝试的启发式方法,除非我弄错了。

【讨论】:

  • 我已经尝试过 CSV 助手,但问题是,在我的情况下,不会有固定的模板,它可以是任何 CSV。在 CSV 助手/Tiny CSVParser 中,我尝试传递一个 Pdf 文件(CSV 扩展名和内容类型为 CSV),这些助手开始读取解析值(错误值,即!@#@##)特殊字符.理想情况下,它不验证文件。它只是将任何内容解析为 CSV
  • 虽然我可以尝试一下,但似乎很难。
  • 尝试 IMO 应该不难。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 2021-09-13
  • 1970-01-01
  • 2019-11-03
  • 2019-02-23
  • 1970-01-01
  • 2019-08-04
相关资源
最近更新 更多