如何使用节点js在tsv文件中写一列?
我必须在tsv文件的列中写入json响应,我该怎么做?我正在使用以下代码。请为我找到解决方案?我必须检查它,但是它不起作用。
//npm init -y gen package.json file
var unProcessedItems = [];
var data = loadData('./Alabama_Pre_Final.tsv');
async function X(i) {
if (data[i] && data[i][7]) {
console.log(data[i][7]);
function address(address_details) {
request({
url: '/?auth-id=xxx&auth-token=xxx',
method: 'POST',
headers: {
'content-type': 'application/json'
},
body: address_details,
},
(error, response, body) => {
if (!error && response.statusCode == 200) {
var res = JSON.parse(body);
let objectArray = [];
if (res.addresses[0].verified) {
objectArray.push(res.addresses[0].api_output[0].delivery_line_1, res.addresses[0].api_output[0].last_line, res.addresses[0].api_output[0].delivery_point_barcode)
}
var address_data = objectArray.join([separator = ','])
console.log(address_data)
}
});
}
address("1000 Greenhill Blvd NW, Fort Payne, 35967, AL, USA");
const data = 'Column 19\n1\t2\t3\n4\t5\t6';
require('fs').writeFileSync('./Alabama_Pre_Final.tsv', data);
// i++;
// X(i);
}
}
}
回答如下:此代码将从输入的.tsv文件中查找地址列(我假设它是制表符分隔的),并将其替换为API调用的结果。
我们也在这里使用请求承诺,以使事情更简单,只需执行:
npm i request-promise
我将输出写到一个单独的文件中,所以我们不会破坏原始内容。
const fs = require("fs");
const rp = require("request-promise");
async function lookupAddress(address_details) {
var options = {
url: 'https://us-extract.api.smartystreets/?auth-id=' + AUTH_ID + '&auth-token=' + AUTH_TOKEN,
method: 'POST',
headers: {'content-type': 'application/json'},
body: address_details,
json: true
};
return rp(options).then(res => {
if (!Array.isArray(res.addresses) || !res.addresses[0] || !res.addresses[0].verified) {
return "Address not found!";
}
const addr = res.addresses[0].api_output[0];
const objectArray = [addr.delivery_line_1, addr.last_line, addr.delivery_point_barcode];
return objectArray.join(',');
}).catch(err => {
return "Address lookup failed: " + err.message;
});
}
async function lookupAddresses() {
var data = loadData('./Alabama_Pre_Final.tsv');
const ADDRESS_COLUMN_INDEX = 7;
for(let row of data) {
// Here we replace the address column with the lookup result.. we could assign to another column if we wished.
row[ADDRESS_COLUMN_INDEX] = await lookupAddress(row[ADDRESS_COLUMN_INDEX]);
}
let output = data.map(row => row.join("\t")).join("\n");
// Write to a separate, output file to avoid clobbering the input file.
fs.writeFileSync('./Alabama_Pre_Final_Output.tsv', output);
}
lookupAddresses();