停止 fast-csv 节点模块的流读取

Posted

技术标签:

【中文标题】停止 fast-csv 节点模块的流读取【英文标题】:Stop stream read of fast-csv node module 【发布时间】:2016-12-10 13:08:48 【问题描述】:

如何使用 fast-csv 节点模块停止读取某个特定索引处的 csv 行?在 fast-csv 中,它们是流暂停和恢复的选项,但没有在某些特定行关闭流的选项。 以下是代码:

var csvstream = CSV
.fromPath(self.fetchFilePath(fileName), ltrim : true, rtrim : true , headers : true , ignoreEmpty : true )
.transform(function (data)
    Object.keys(data).forEach(function (key) 
       var newKey       = key.trim();
       data[newKey]     = data[key].trim();
    );
    return data;
)
.on("data", function(data)
     //checking unicode char presence
     Object.keys(data).forEach(function (key) 
       if(data[key])
          var charValue   = PUNYCODE.ucs2.decode(data[key]);
          charValue = charValue.map(function(val) 
             if(val>126)
               FileCleanFlag=false;
               errorData.push(data);
             
          );
       else
          FileCleanFlag=false;
       
     );

     if(!FileCleanFlag)
        #here want to jump to end block instead of parsing next rows
     
)
.on('end', function ()
    #some work on rows containing error
);

在上面的代码中,如果某行发生错误,我如何跳转到“结束”块?

【问题讨论】:

欢迎来到 ***!我建议你分享你已经做过的事情(例如你的代码)——那时人们会更有可能帮助你 @deeveeABC : 添加代码示例 有人帮忙吗? 【参考方案1】:

没有很好的方法来结束流。您可以将 FileCleanFlag 定义为 true,然后如果它的 false 不再起作用。

var FileCleanFlag = true;
var csvstream = CSV
.fromPath(self.fetchFilePath(fileName), ltrim : true, rtrim : true , headers : true , ignoreEmpty : true )
.transform(function (data)
Object.keys(data).forEach(function (key) 
   var newKey       = key.trim();
   data[newKey]     = data[key].trim();
);
    return data;
)
.on("data", function(data)
     if (!FileCleanFlag)  return; 
     //checking unicode char presence
     Object.keys(data).forEach(function (key) 
     if(data[key])
      var charValue   = PUNYCODE.ucs2.decode(data[key]);
      charValue = charValue.map(function(val) 
         if(val>126)
           FileCleanFlag=false;
           errorData.push(data);
         
      );
   else
      FileCleanFlag=false;
   
 );

 if(!FileCleanFlag)
    #here want to jump to end block instead of parsing next rows
 
)
.on('end', function ()
   #some work on rows containing error
);

如果您需要走这条路,请参阅How to close a readable stream (before end)? 了解如何关闭流黑客。

您也可以抛出错误并相应地捕获它。

【讨论】:

那么我们可以使用 stream.destroy() 和 fast-csv 以便控制转到 on.('close') 块吗?

以上是关于停止 fast-csv 节点模块的流读取的主要内容,如果未能解决你的问题,请参考以下文章

导入节点模块时出现流错误“无法解析模块”

如何从节点模块读取文件?

从节点 fs 模块中的绝对路径读取本地文件

exceljs节点模块读取.xls文件时出错

无法将节点 fs 模块与 k6 一起使用

在工作节点上安装 SPARK 模块