问题描述
我正在尝试编写一个CSV文件,该文件具有我不断从BlockingCollection
obj获取的值。仪器会不断输出逗号分隔的字符串值,我正在使用Producer-Consumer设计模式将其写入队列。我在使用者端枚举Queue,然后将字符串转换为列表。
最后遍历列表,并将结果逐行写入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();
现在已删除第二个呼叫。这没有什么区别,并且在更改代码时被意外遗留了。
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 ();
}
解决方法
感谢“安迪”的提示,感谢其他人的时间。
分析之后,我发现仪器(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”,如上所述。