NodeJS 如何使用npm“csv”或“csvtojson”包有条件地删除整个记录?

niwlg2el  于 2023-06-22  发布在  Node.js
关注(0)|答案(1)|浏览(152)

我想使用npm“csv”sync API通过解析将CSV值存储到对象变量中。

// Read the CSV file synchronously
const csvData = fs.readFileSync(csvFilePath, "utf-8");

// Parse the CSV data synchronously
const parsedData = parse(csvData, {
   delimiter: ",",
   skip_empty_lines: true,
   skip_records_with_error: true,
   skip_records_with_empty_values: true,
   cast: function (val, ctx) {
      if (ctx.header) {
         return val;
      }

      if (!val.length) {
         return undefined;
      }

      switch (ctx.index) {
         case 0:
            return new Date(val);
         default:
            return Number(val).toFixed(2);
      }
   },
   columns: true,
   trim: true,
});

这里是代码

if (!val.length) {
         return undefined;
      }

不是我想要的那样。我试图跳过所有的记录,其中任何领域是空的,例如:string,,,,。使用skip_records_with_empty_values对我不起作用,因为它不是任何字段丢失,而是值丢失。我尝试返回nullundefined。什么都不管用
所以我现在的问题是,我如何简单地有条件地过滤掉,而不必对结果使用过滤器?
编辑:我尝试过使用“csv”和“csvtojson”包来实现这一点,但我似乎无法找到一种简单的方法来预构建包本身。

bxfogqkk

bxfogqkk1#

如果您想过滤掉CSV文件中任何字段缺少值的记录,可以修改解析逻辑来实现这一点。您可以在将解析后的数据存储到对象变量中之前手动过滤解析后的数据,而不是使用skip_records_with_empty_values选项。
下面是一个更新的代码片段,其中包括手动过滤步骤:

// Read the CSV file synchronously
const csvData = fs.readFileSync(csvFilePath, "utf-8");

// Parse the CSV data synchronously
const parsedData = parse(csvData, {
  delimiter: ",",
  skip_empty_lines: true,
  skip_records_with_error: true,
  cast: function (val, ctx) {
    if (ctx.header) {
      return val;
    }

    if (!val.length) {
      return undefined;
    }

    switch (ctx.index) {
      case 0:
        return new Date(val);
      default:
        return Number(val).toFixed(2);
    }
  },
  columns: true,
  trim: true,
});

// Filter out records with missing values
const filteredData = parsedData.filter(record => {
  return Object.values(record).every(value => value !== undefined);
});

// Store the filtered data in your object variable
const filteredObject = filteredData;

// Use the filteredObject as needed

在解析CSV数据之后,检查parsedData数组中是否每个记录中的任何值未定义。如果定义了所有值(即没有缺失值),则该记录将包含在filteredData数组中。最后,filteredData存储在对象变量filteredObject中。
这样,您就可以手动过滤掉记录,而不必仅依赖skip_records_with_empty_values选项。

相关问题