【问题标题】:How can write a column in tsv file using node js?如何使用节点 js 在 tsv 文件中写入列?
【发布时间】:2019-10-14 07:30:29
【问题描述】:

我必须在 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: 'https://us-extract.api.smartystreets.com/?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);
  }
}
}

【问题讨论】:

  • 这个输入地址是否在数据文件的某一列中?也许是第 7 列?谢谢!

标签: node.js writefile


【解决方案1】:

我已经查看了您上面的答案,我认为修改它应该很容易,以便它按您的预期工作,我在下面完成了这个。其他功能应保持不变。因此,函数 X 处理每一行,然后返回一个 record 变量,我们将其附加到记录数组中。处理完成后,我们将记录数组写入 csv 文件。

async function loadData(filePath) {
    if (fs.existsSync(filePath)) {
        var tsvData = fs.readFileSync(filePath, 'utf-8');
        var rowCount = 0;
        var scenarios = [];
        parse_tsv(tsvData, (row) => {
            rowCount++;
            if (rowCount > 1) {
                scenarios.push(row);
            }
        });
        return scenarios;
    } else {
        console.log("loadData: Returning empty..")
        return [];
    }
}

// Process a row of TSV data
function X(row) {
    return new Promise((resolve, reject) => {
        if (row && row[7]) {
            console.log(row[7]);
            request({
                url: 'https://us-extract.api.smartystreets.com/?auth-id=e62698e8-c3fc-b929-0f5b-d3b54d0bcd0c&auth-token=cibfMexBdl3HrmwbWY6p',
                method: 'POST',
                headers: { 'content-type': 'application/json' },
                body: row[7],
            },
                (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].components.city_name,
                        res.addresses[0].api_output[0].components.zipcode, res.addresses[0].api_output[0].components.state_abbreviation)
                    }
                    var address_data = objectArray.join([separator = ','])
                    resolve({ name: address_data.replace(/['"]+/g, '') });
                } else if (error) { 
                    reject(error);
                } else {
                    reject( { statusCode: response.statusCode });
                }
            });
        }
    });
}

async function processData() {
    let MAX_RECORDS = 5; // Change as appropriate
    var data = await loadData('./Alabama_Pre_Final.tsv');
    if (data.length > 0) {
        unProcessedItems = [];
        let records = [];
        for(let row of data) {
            // Process a row of data.
            let record = await X(row);
            records.push(record);
            if (records.length === MAX_RECORDS) break;
        }
        console.log(records);
        csvWriter.writeRecords(records)
            .then(() => console.log('The CSV file was written successfully'));
    } else {
        console.log("No Data");
    }
}

processData();

【讨论】:

  • 我无法编写 tsv 文件,请检查我的代码并帮助我?我必须将数据写入不同的列,我该怎么写?
  • 没问题@Mariam,我会去看看! :-)
  • 请给我一个解决方案?
【解决方案2】:
const fs = require('fs');
const createCsvWriter = require('csv-writer').createObjectCsvWriter;
var rp = require('request-promise');
var dataToWrite;
var http = require("http");
var request = require('request');

function loadData(filePath) {
if (fs.existsSync(filePath)) {
var tsvData = fs.readFileSync(filePath, 'utf-8');
var rowCount = 0;
var scenarios = [];
parse_tsv(tsvData, (row) => {
rowCount++;
if (rowCount > 1) {
scenarios.push(row);
}
});
return scenarios;
} else {
return [];
}
}

function parse_tsv(s, f) {
var ix_end = 0;
for (var ix = 0; ix < s.length; ix = ix_end + 1) {
ix_end = s.indexOf('\n', ix);
if (ix_end == -1) {
ix_end = s.length;
}
//var row = s.substring(ix, ix_end - 1).split('\t');
var row = s.substring(ix, ix_end).split('\t');
f(row);
}
}

var unProcessedItems = [];
var data = loadData('./Alabama_Pre_Final.tsv');
var records = [];
async function X(i) {
    if (data[i] && data[i][7]) {
        console.log(data[i][7]);

      var options = {
        method: 'POST',
        url: 'https://us-extract.api.smartystreets.com/?auth-id=c64de073-9531-9444-35e6-7204d9d62c36&auth-token=e5FxYc1niUD7Cp0peixd',
        headers: {
          'content-type': 'application/json'
        },
        body: data[i][7],
        json: true // Automatically stringifies the body to JSON
      };
      rp(options)
        .then(function (parsedBody) {
          // POST succeeded...
          var res = parsedBody;
          let objectArray = [];
          if (res.addresses.length) {
            if (res.addresses[0].verified) {
              objectArray.push(res.addresses[0].api_output[0].delivery_line_1, res.addresses[0].api_output[0].components.city_name,
                res.addresses[0].api_output[0].components.zipcode, res.addresses[0].api_output[0].components.state_abbreviation)
            }
            var address_data = objectArray.join([separator = ','])
            console.log(address_data)
            // records.push({ name: address_data.replace(/['"]+/g, '') });
            const ADDRESS_COLUMN_INDEX = 7;
            for(let row of address_data) {
                row[ADDRESS_COLUMN_INDEX] = await X(row[ADDRESS_COLUMN_INDEX]);
            }
            records.push(address_data.replace(/['"]+/g, ''));
            let output = records.map(row => row.join("\t")).join("\n");           
            i++;
            if (i <= 7) {
              X(i);
            } 
            else {
             fs.writeFileSync('out.tsv', output);
              console.log('The TSV file was written successfully');
              // return callback(records);
            }
          }
        });
    }
    // console.log(records);
  }
  if (data.length > 0) {
    unProcessedItems = [];
    X(0);
  } else {
    console.log("No Data");
  }

【讨论】:

    【解决方案3】:

    我已根据您的最新修订更新了此答案,希望对您有所帮助:

    function loadData(filePath) {
        if (fs.existsSync(filePath)) {
            var tsvData = fs.readFileSync(filePath, 'utf-8');
            var rowCount = 0;
            var scenarios = [];
            parse_tsv(tsvData, (row) => {
                rowCount++;
                if (rowCount > 1) {
                    scenarios.push(row);
                }
            });
            return scenarios;
        } else {
            return [];
        }
    }
    
    function parse_tsv(s, f) {
        var ix_end = 0;
        for (var ix = 0; ix < s.length; ix = ix_end + 1) {
            ix_end = s.indexOf('\n', ix);
            if (ix_end == -1) {
                ix_end = s.length;
            }
            var row = s.substring(ix, ix_end).split('\t');
            f(row);
        }
    }
    
    var unProcessedItems = [];
    var data = loadData('./Alabama_Pre_Final.tsv');
    var records = [];
    async function X(i) {
        if (data[i] && data[i][7]) {
            console.log(data[i][7]);
    
        var options = {
            method: 'POST',
            url: 'https://us-extract.api.smartystreets.com/?auth-id=c64de073-9531-9444-35e6-7204d9d62c36&auth-token=e5FxYc1niUD7Cp0peixd',
            headers: {
            'content-type': 'application/json'
            },
            body: data[i][7],
            json: true // Automatically stringifies the body to JSON
        };
        rp(options)
            .then(async function (parsedBody) {
                // POST succeeded...
                var res = parsedBody;
                let objectArray = [];
                if (res.addresses.length) {
                    if (res.addresses[0].verified) {
                        objectArray.push(res.addresses[0].api_output[0].delivery_line_1, res.addresses[0].api_output[0].components.city_name,
                            res.addresses[0].api_output[0].components.zipcode, res.addresses[0].api_output[0].components.state_abbreviation)
                    }
                    var address_data = objectArray.join([separator = ','])
                    console.log("rp.then -> address_data:",address_data);
                    data[i][7] = address_data.replace(/['"]+/g, '');
                    records.push(data[i].join("\t"));         
                    i++;
                    if (i <= 7) {
                        console.log("Looking up address #" + i);
                        X(i);
                    } else {
                        const output = records.join("\n");  
                        // Remove the _test when you are happy with the result.
                        fs.writeFileSync('./Alabama_Pre_Final_test.tsv', output);
                        console.log('The TSV file was written successfully');
                    }
                }
            });
        }
    }
    if (data.length > 0) {
        unProcessedItems = [];
        X(0);
    } else {
        console.log("No Data");
    }
    

    【讨论】:

    • 我已经尝试了以下格式,但它不起作用。输出文件显示空结果。请检查我的分析器并帮助我?
    • 嗨@Mariam,请查看我对这个答案的更新。谢谢!!
    • 我必须将我的结果数据写入 ('./Alabama_Pre_Final.tsv') 文件的 7 列。我该怎么办?
    • 我已更新此答案以更改 .tsv 文件的第 7 列。我已经写信给 ./Alabama_Pre_Final_test.tsv ,如果您对结果满意,可以删除 _test。
    猜你喜欢
    • 2015-12-18
    • 2014-04-19
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多