如果数据格式略有破坏,是否仍然可以确定其文件类型?

时间:2015-03-09 13:13:08

标签: javascript json node.js validation csv

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

当文件稍微损坏时会出现问题,并且在解析过程中会失败。在这些情况下,是否有一个相当好的启发式可以猜测文件类型,以便我可以进一步" lint"根据这种格式的数据?

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

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

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个方法都失败了。

1 个答案:

答案 0 :(得分:2)

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

它允许检查已知&#34;魔法&#34;的文件。身份标识。通常,它只需要访问文件的前几个字节来执行此操作。

我想这种方法本身可能会被认为是#34;暴力&#34;但至少它依赖于一个着名且经过良好测试的图书馆。

在mmmagic的初步建议未能提供魔力后更新:

如果您始终使用请求模块通过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,可能适合在您自己的代码中重新调整用途。