使用 Node JS 从 CSV 文件中删除某些列具有空白值的行

问题描述 投票:0回答:2

我有一个 CSV 文件,其中一行缺少某些值。因此,如果某个值丢失,那么我们需要从 CSV 文件中删除该行。我在这样做时遇到了问题。请帮我解决这个问题。

javascript node.js csv
2个回答
0
投票

我们可以使用CSV解析库,比如优秀的Papa Parse来解析数据,然后我们可以根据我们想要过滤的列来过滤行。

例如:

const Papa = require('papaparse');

let csvData = `Col1,Col2,Col3\na1,b1,c1\na2,,c2\na3,b3,c3`;

let { data } = Papa.parse(csvData, { header: true });
console.log("Original csv data:");
console.log(csvData);

function filterEmptyValues(data, column) {
    return data.filter(row => row[column]);
}

let filteredData = filterEmptyValues(data, "Col2");
let filteredCsv = Papa.unparse(filteredData);
console.log("\nFiltered csv:")
console.log(filteredCsv);

0
投票

我想根据我所学到的知识提供我的解决方案,并且还遇到了解析记录中具有空值的数据的问题。我使用了 CSV Parser for Node.js,你必须在终端中运行“npm install csv-parse”来安装 CSV 解析器。

假设我们有这样一个data.csv文件:

FIRST NAME,LAST NAME,EMAIL ADDRESS
Larry,Makwin,[email protected]
Brad,Hilfer
Arnold,Broowy,[email protected]
Alice,Mikelanjelo,[email protected]
Harry,Chakni
Walter,Silver,[email protected]

我们需要返回一个记录对象数组。返回的数组不应包含具有空电子邮件的对象。

以下代码演示了解决方案:

const fs = require("fs");
const { parse } = require("csv-parse");

const result = [];

async function getCSV () {
    const parsingData = fs
        .createReadStream('data.csv')
        .pipe(parse(
            {
                columns: true, 
                delimiter: ',',
                skip_records_with_error: true
            }
        ));
        for await (const row of parsingData) {
            result.push(row);
        }
    return result;
}

async function init(){
    const records = await getCSV();
    console.info(records);
}

init();

输出将是:

[
  {
    'FIRST NAME': 'Larry',
    'LAST NAME': 'Makwin',
    'EMAIL ADDRESS': '[email protected]'
  },
  {
    'FIRST NAME': 'Arnold',
    'LAST NAME': 'Broowy',
    'EMAIL ADDRESS': '[email protected]'
  },
  {
    'FIRST NAME': 'Alice',
    'LAST NAME': 'Mikelanjelo',
    'EMAIL ADDRESS': '[email protected]'
  },
  {
    'FIRST NAME': 'Walter',
    'LAST NAME': 'Silver',
    'EMAIL ADDRESS': '[email protected]'
  }
]

因此我们跳过“Brad,Hilfer”和“Harry,Chakni”记录,因为我们在列中没有电子邮件数据。

在这个任务中对我来说最重要的是找到 skip_records_with_error: true 选项,它解决了我的问题。我希望这对某人有用。谢谢。

© www.soinside.com 2019 - 2024. All rights reserved.