我有一个 CSV 文件,其中一行缺少某些值。因此,如果某个值丢失,那么我们需要从 CSV 文件中删除该行。我在这样做时遇到了问题。请帮我解决这个问题。
我们可以使用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);
我想根据我所学到的知识提供我的解决方案,并且还遇到了解析记录中具有空值的数据的问题。我使用了 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 选项,它解决了我的问题。我希望这对某人有用。谢谢。