【问题标题】:If the format of a data is slightly broken, is it still possible to determine its filetype?如果数据的格式稍有损坏,是否仍然可以确定其文件类型?
【发布时间】:2015-05-10 15:51:26
【问题描述】:

我有一个随机文本数据,我需要确定它的文件类型,例如 .xls、.csv、.tsv、.json 和 .html。目前我正在使用蛮力来解析所有不同格式的文件。

我的问题发生在文件轻微损坏时,并且在解析过程中会失败。在这些情况下,是否有相当好的启发式算法可以猜测文件类型,以便我可以根据这种格式进一步“整理”数据?

我正在使用 node.js,以防已经有一个库。我对 node.js 之外的解决方案持开放态度。

我尝试使用 mmmagic,但它只返回“text/plain”,而不是我需要的信息(.tsv、.json、.xml),livescript 中的示例代码:

useMagic = (res)->
    buf = new Buffer res.body
    magic = new mmmagic.Magic! ##return UTF-8 Unicode text, with very long lines, with no line terminators
    #magic = new mmmagic.Magic mmmagic.MAGIC_MIME ## return text/plain; charset=utf-8
    #magic = new mmmagic.Magic mmmagic.MAGIC_MIME_TYPE ##text/plain



    err, magicalres <- magic.detect buf
    magicalres |> console.log 


url = "https://sheethub.com/data.fda.gov.tw/%E4%B8%8D%E7%AC%A6%E5%90%88%E9%A3%9F%E5%93%81%E8%B3%87%E8%A8%8A%E8%B3%87%E6%96%99%E9%9B%86/i/96/%E7%B3%AF%E7%B1%B3?page=1&format=json"
err, res, body <- request {"url": url, "encoding": null}
result = res |> useMagic

我正在添加已编译的 javascript 代码,也许这样会更容易:

request = require('request');
mmmagic = require('mmmagic');


useMagic = function(res){
  var buf, magic;
  buf = new Buffer(res.body);
  magic = new mmmagic.Magic();
  return magic.detect(buf, function(err, magicalres){
    return console.log(
    magicalres);
  });
};
url = "https://sheethub.com/data.fda.gov.tw/%E4%B8%8D%E7%AC%A6%E5%90%88%E9%A3%9F%E5%93%81%E8%B3%87%E8%A8%8A%E8%B3%87%E6%96%99%E9%9B%86/i/96/%E7%B3%AF%E7%B1%B3?page=1&format=json";
request({
  "url": url,
  "encoding": null
}, function(err, res, body){
  var result;
  return result = useMagic(
  res);
});

我一直在使用包括res.headers['content-type']在内的组合方法,但仍然有cases所有方法都失败了。

【问题讨论】:

    标签: javascript json node.js validation csv


    【解决方案1】:

    您是否厌倦了mmmagic 模块,它提供了对libmagic 的绑定?

    它允许检查文件中已知的“神奇”标识符。通常它只需要访问文件的前几个字节就可以做到这一点。

    我猜这种方法本身可能被认为是“蛮力”,但至少它依赖于一个知名且经过良好测试的库。

    在 mmmagic 的初始建议未能发挥魔力后更新:

    如果您总是使用 request 模块通过 HTTP(S) 请求数据,那么响应标头可能会提供提示:

    // returns 'text/json' for your data.fda.gov.tw sample
    var mimeType = res.headers['content-type'];
    

    否则,fsql Perl 模块包含 regex-based logic for determining if text is CSV, TSV, YAML or JSON,可能适合在您自己的代码中重新利用。

    【讨论】:

    • 这个库似乎相当轻巧,看起来它返回了你需要的东西:)
    • 谢谢,我刚刚使用 mmagic 添加了我的示例代码。它只给我诸如“计划/文本”之类的信息。也许我用错了?
    • 我编辑了问题,所以我使用res.headers['content-type'],但是当这不起作用时仍然有cases。感谢github.com/perlancar/perl-App-fsql/blob/master/bin/… 我正在检查它是否适用于我的情况。谢谢!
    猜你喜欢
    • 2021-03-06
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    相关资源
    最近更新 更多