【问题标题】:CSVhelper writefield method adds empty line between data chunks. How to avoid the empty lines between data chunks?CSVhelper writefield 方法在数据块之间添加空行。如何避免数据块之间的空行?
【发布时间】:2020-08-26 01:51:30
【问题描述】:

我正在尝试编写一个 CSV 文件,其中包含我不断从 BlockingCollection obj 获取的值。 Instrument 不断输出逗号分隔的字符串值,我正在使用 Producer-Consumer 设计模式将其写入队列。我正在枚举消费者端的队列,然后将字符串转换为列表。

最后遍历列表并将结果逐行写入 CSV 文件。迭代列表时我没有空行。我在每个消费者枚举之间都得到一个空行。如何避免这个空行?

执行上述操作的部分代码如下:

public void Consumer_current()
{
    Stopwatch Consumer_time = new Stopwatch();
    double time = 0.0;
    var sw = new StreamWriter("sample.csv", false);
    var csv_write = new CsvWriter(sw, CultureInfo.InvariantCulture);

    Consumer_time.Start();
    

    // Consumer Task constantly checking the Queue and enumerating    
    foreach (var current_string in current_data.GetConsumingEnumerable())
    {
        var item_List = current_string.Split(',').ToList();

        // Iterating the list, writing the values to CSV file
        foreach (var item in item_List)       
        {
            
             
            time += 1;

            var record = time + "," + item;

            csv_write.WriteField(record, false);
            Console.WriteLine(record);

            csv_write.NextRecord();
        }
    }

   
    csv_write.Flush();
    Console.WriteLine("flushing");
}

编辑 1:

csv_write.NextRecord(); 2nd call 现在被删除。它没有任何区别,它是在更改代码时意外留下的。

在下面添加了生产者代码:

 public void Produce_current () {

     Stopwatch DataCapture_time = new Stopwatch ();

     DataCapture_time.Start ();

     while (DataCapture_time.Elapsed <= TimeSpan.FromSeconds (20)) {
         while (DataCapture_time.Elapsed <= TimeSpan.FromSeconds (1.3)) {

         }

         device_instance.WriteString ("FETC:ELOG? 10000,(@1)");
         var Data_log_results = device_instance.ReadString ();

         current_data.Add (Data_log_results);
     }
     current_data.CompleteAdding ();
 }
 

【问题讨论】:

  • 似乎有人无意中调用了csv_write.NextRecord()。您可以仔细检查两个调用是否都需要输出预期的结果。
  • 我们能看到来自current_data.GetConsumingEnumerable()的数据吗?一切看起来都很好,虽然有些事情可以做得更合适,但它应该可以在没有空行的情况下正常工作。我要说的是该方法有空字符串。
  • 不相关,但您不处置您的流。使用 C# 8,您只需将 using 放在 var 前面(使用关键字而不是使用块)。
  • 我也试过 var item_List = current_string.Split(',').Where(x => !string.IsNullOrWhiteSpace(x)).ToList();仍然存在空行。

标签: c# csv csvhelper


【解决方案1】:

感谢“Andy”的提示,以及其他人的时间。

进行分析后,我发现仪器(Keysight - N6705B,功率分析仪)正在使用字符串块和“\n”写入内部存储器缓冲区。每次当我从设备的内部存储器中读取一个新值时,它都会附加一个换行符,这会在写入 csv 文件时反映出来。 注意:设备数据为ASCII格式。

为了解决这个问题,我稍微修改了 Producer_current() 块中的代码。

{

device_instance.WriteString("FETC:ELOG?10000,(@1)"); var Data_log_results = device_instance.ReadString();

//修改部分代码删除换行符和回车-我使用的是windows操作系统

            Data_log_results = Data_log_results.TrimEnd('\r', '\n');

}

上面的代码非常适合想要使用 csvhelper 从动态变化的列表中逐行写入 CSV 文件的人。

如前所述,任何人从仪器缓冲区中卡住读取都需要删除“\n”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 2018-10-22
    • 2023-03-30
    相关资源
    最近更新 更多