CSVhelper writefield 方法在数据块之间添加空行。如何避免数据块之间的空行?
CSVhelper writefield method adds empty line between data chunks. How to avoid the empty lines between data chunks?
我正在尝试编写一个 CSV 文件,其中包含我不断从 BlockingCollection
obj 中获取的值。 Instrument 不断输出以逗号分隔的字符串值,我使用生产者-消费者设计模式将其写入队列。我在消费者端枚举队列,然后将字符串转换为列表。
最后遍历列表并将结果逐行写入 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 ();
}
感谢“Andy”的提示,感谢其他人的宝贵时间。
分析后我发现仪器(Keysight - N6705B,功率分析仪)正在用字符串块和“\n”写入内部存储器缓冲区。 Every-time 当我从设备的内部存储器中读取一个新值时,它会附加一个换行符,这在写入 csv 文件时反映出来。
注意:来自设备的数据为 ASCII 格式。
为了解决这个问题,我稍微修改了 Producer_current() 块中的代码。
{
device_instance.WriteString("FETC:ELOG?10000,(@1)");
var Data_log_results = device_instance.ReadString();
//修改部分代码以删除换行符和回车 return - 我正在使用 windows OS
Data_log_results = Data_log_results.TrimEnd('\r', '\n');
}
上面的代码非常适合想要使用 csvhelper 从动态变化的列表中逐行编写 CSV 文件的人。
任何无法读取仪器缓冲区的人都需要如上所述删除“\n”。
我正在尝试编写一个 CSV 文件,其中包含我不断从 BlockingCollection
obj 中获取的值。 Instrument 不断输出以逗号分隔的字符串值,我使用生产者-消费者设计模式将其写入队列。我在消费者端枚举队列,然后将字符串转换为列表。
最后遍历列表并将结果逐行写入 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 ();
}
感谢“Andy”的提示,感谢其他人的宝贵时间。
分析后我发现仪器(Keysight - N6705B,功率分析仪)正在用字符串块和“\n”写入内部存储器缓冲区。 Every-time 当我从设备的内部存储器中读取一个新值时,它会附加一个换行符,这在写入 csv 文件时反映出来。 注意:来自设备的数据为 ASCII 格式。
为了解决这个问题,我稍微修改了 Producer_current() 块中的代码。
{
device_instance.WriteString("FETC:ELOG?10000,(@1)"); var Data_log_results = device_instance.ReadString();
//修改部分代码以删除换行符和回车 return - 我正在使用 windows OS
Data_log_results = Data_log_results.TrimEnd('\r', '\n');
}
上面的代码非常适合想要使用 csvhelper 从动态变化的列表中逐行编写 CSV 文件的人。
任何无法读取仪器缓冲区的人都需要如上所述删除“\n”。