我正在尝试编写一个CSV文件,其中包含我经常从BlockingCollection对象中获取的值。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();的第二个调用被删除了,now.It并没有起到什么作用,它是在更改代码时意外留下的。
生产者代码添加如下:
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 ();
}发布于 2020-08-27 06:18:31
感谢"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“。
https://stackoverflow.com/questions/63589375
复制相似问题