PHP 玩家表示倒没什么感觉,不过都是工具而已,不必太依赖某一门语言的语法。
这两天我也在有做一些数据统计相关的活儿,大致需要将某个 JSON 里面的 URL 指向的文件的 MIME type 和实际的长度读出来。懒得用 py 去加载 json,也懒得折腾请求库之类的东西,想了一下,干脆用原生支持的 JavaScript 执行 curl 命令吧,大概举个相似的例子:
比如说这里我有一个文件,起名为 data.json
,接下来我想知道其中每个 URL 对应的资源的类型和数据大小,然后导出 csv 给 Excel 用:
[
{
"pid": "882545d7ly1g37n99ah7sj20dw0dw409",
"url": "https://wx2.sinaimg.cn/orj360/882545d7ly1g37n99ah7sj20dw0dw409.jpg"
},
{
"pid": "882545d7ly1g37n99kh8lj20dw0dwgn8",
"url": "https://wx3.sinaimg.cn/orj360/882545d7ly1g37n99kh8lj20dw0dwgn8.jpg"
},
{
"pid": "882545d7ly1g37n98zu2bj20dw0dwtad",
"url": "https://wx3.sinaimg.cn/orj360/882545d7ly1g37n98zu2bj20dw0dwtad.jpg"
},
{
"pid": "882545d7ly1g37n99w9fbj20dw0dw761",
"url": "https://wx2.sinaimg.cn/orj360/882545d7ly1g37n99w9fbj20dw0dw761.jpg"
},
{
"pid": "882545d7ly1g37n9actztj20dw0dwwga",
"url": "https://wx1.sinaimg.cn/orj360/882545d7ly1g37n9actztj20dw0dwwga.jpg"
},
{
"pid": "882545d7ly1g37n9aopxyj20dw0dwmyv",
"url": "https://wx1.sinaimg.cn/orj360/882545d7ly1g37n9aopxyj20dw0dwmyv.jpg"
},
{
"pid": "882545d7ly1g37n9b09qwj20dw0dwta2",
"url": "https://wx2.sinaimg.cn/orj360/882545d7ly1g37n9b09qwj20dw0dwta2.jpg"
},
{
"pid": "882545d7ly1g37n9b9tecj20dw0dwjsv",
"url": "https://wx4.sinaimg.cn/orj360/882545d7ly1g37n9b9tecj20dw0dwjsv.jpg"
},
{
"pid": "882545d7ly1g37n9bi2qdj20g50ilmxs",
"url": "https://wx1.sinaimg.cn/orj360/882545d7ly1g37n9bi2qdj20g50ilmxs.jpg"
}
]
直接 Node.js 梭哈一段代码:
const util = require('util');
const exec = util.promisify(require('child_process').exec);
const imgArr = require('./data.json');
(async function () {
const result = [];
for (let index = 0; index < imgArr.length; index++) {
const item = imgArr[index];
const { url } = item;
const { stdout, stderr } = await exec(`curl -I ${url}`);
// console.log('stdout:', stdout);
// console.log('stderr:', stderr);
const contentType = stdout.match(/Content-Type: (.*)/i)[1];
const contentLength = stdout.match(/Content-Length: (.*)/i)[1];
result.push({
...item,
contentType,
contentLength,
});
}
console.log(objArr2CSV(result));
})();
function objArr2CSV(objArr) {
return [
Object.keys(objArr[0])
.map(key => `"${key}"`)
.join(','),
...objArr.map(item => {
return Object.keys(item)
.map(key => `"${item[key]}"`)
.join(',');
}),
].join('\n');
}
大致干的事情就是,遍历 data.json
的各条记录里面URL字段的值,然后执行命令 curl -I https://xxxxxx
,拿到这条命令执行时往 stdout
输出的字符串,用正则表达式从中匹配到需要的结果、加到原来的条目里面,最后把新的记录转换为 csv 格式的字符串输出。
实际操作可用 shell 的数据流重导向语法把输出导到一个文件里面。
node test.js > test.csv
接着就能用 Excel 打开这个文件进一步去玩了。
脑洞了一下,代码就像是胶水,胶水的成分多种多样,有好也有坏,有的胶水有特定的用途,有的是所谓“万能胶”。然而不管什么胶水,它们并不占主要的地位,我们用它的最终目的仅仅是把东西(任务)粘在一起而已。
也许什么都能粘好的“万能胶”实际上并不存在,多多少少会有一些局限吧~
当然,还是希望手上的胶水更加“万能”一些~