BeM*_*end 7 command-line csv text-processing
我正在尝试从 JSON 文件中提取信息并将一些内容写入 CSV 文件。
这是我的文字示例
"data":{"headers":{"sender":"frank@abc.com"
"to":"jim@def.com"
"subject":"Help with this project"
"x-received-time":"14144273245408"
"received":"from abc.com ()\r\n by mail.mail.com with SMTP (Postfix)\r\n for jim@def.com;\r\n Mon
"from":"\"Help with this project\" <frank@abc.com>"
"date":"Mon, 27 Oct 2014 09:03:14 -0500"
"id":"1414427328-2345855-frank"
"to":"jim@def.com"
"time":14144273245408
"subject":"Help with this project"
"fromfull":"frank@abc.com"
Run Code Online (Sandbox Code Playgroud)
我想从以下位置获取内容:to、fromfull、id、subject、date 并将其写入 csv 文件,其中 To 是 A 列,fromfull 是 B 列,依此类推。
任何人都可以提供任何帮助吗?这是一个 JSON 响应。
小智 15
您可以在一行中将此 JSON 转换为 CSV jq。
jq '.data.headers | [.sender, .to, .subject, ."x-received-time",
.received, .from, .date, .id, .to, .subject, .fromfull]
+ [(.time | tostring)] | join(", ")'
Run Code Online (Sandbox Code Playgroud)
分解:
.data.headers - 将标头作为对象发出
.data[].headers[…string keys list…] - 将字符串值作为数组发出+ [(.time | tostring)] - 将时间作为字符串发出并添加到数组中join(", ") - 使用逗号和空格连接数组值
您可以使用以下 perl 命令创建 CSV 输出,打开终端并键入:
perl -n0e '@a= $_ =~ /"date":(".*?").*?"id":(".*?").*?"to":"(.*?)".*?".*?"subject":(".*?").*?"fromfull":"(.*?)"/gs; while (my @next_n = splice @a, 0, 5) { print join(q{,}, @next_n)."\n"}' inputfile.txt
Run Code Online (Sandbox Code Playgroud)
即使您的输入文件中有多个标题,它也能工作。
请注意,只考虑最后一个“to”:字段(似乎您的标题提供了两次信息)
命令输出:
"Mon, 27 Oct 2014 09:03:14 -0500","1414427328-2345855-frank",jim@def.com,"Help with this project",frank@abc.com
Run Code Online (Sandbox Code Playgroud)
既然您正在处理 JSON 文件,为什么不这样解析呢?安装nodejs-legacy并创建一个 NodeJS 脚本,例如:
#!/usr/bin/env node
// parseline.js process lines one by one
'use strict';
var readline = require('readline');
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
terminal: false
});
rl.on('line', function(line){
var obj = JSON.parse(line);
// add the fields which you want to extract here:
var fields = [
obj.data.headers.to,
obj.data.headers.subject,
// etc.
];
// print the fields, joined by a comma (CSV, duh.)
// No escaping is done, so if the subject contains ',',
// then you need additional post-processing.
console.log(fields.join(','));
});
Run Code Online (Sandbox Code Playgroud)
假设文件的每一行都有一个有效的 JSON 字符串:
node parseline.js < some.txt
Run Code Online (Sandbox Code Playgroud)
或者,如果您真的想读取单个文件并从中解析字段:
node parseline.js < some.txt
Run Code Online (Sandbox Code Playgroud)
然后运行它:
node parsefile.js yourfile.json > yourfile.csv
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
77031 次 |
| 最近记录: |