【发布时间】: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();仍然存在空行。