C#处理CSV转XML时如何在读取指定行数后终止foreach循环
实现方案
方法1:使用LINQ的Take()方法(推荐)
- 代码改动最小,仅需调整遍历的集合对象,使用前需要先引入LINQ命名空间:
using System.Linq; - 自动截取集合前N个元素遍历,无需额外写判断逻辑
修改后的循环代码如下,原有循环内的XML写入逻辑不需要做任何改动:
// 括号内的数字替换为你需要停止的行数即可,这里示例取前10行处理 foreach (var line in lines.Take(10)){ var csvItem = line.Split(';'); writer.WriteStartElement("DC8_Recipe"); writer.WriteAttributeString("PlantNo", "01"); writer.WriteAttributeString("FactoryNo", "01"); writer.WriteAttributeString("No", csvItem[0].Replace('"', ' ')); writer.WriteAttributeString("Name", csvItem[2]); writer.WriteAttributeString("ShortName", csvItem[3]); writer.WriteEndElement(); writer.WriteStartElement("RecipeSetValueRow"); writer.WriteAttributeString("SetValue", csvItem[12]); writer.WriteStartElement("Material"); writer.WriteAttributeString("No", csvItem[10]); writer.WriteEndElement(); writer.WriteEndElement(); }
方法2:新增计数器手动终止循环
如果不想引入LINQ依赖,可以在循环内新增计数变量,达到指定行数后调用break直接退出循环:
int count = 0; // 定义停止的行数阈值 int stopLine = 10; foreach (var line in lines){ if(count >= stopLine) { // 达到行数上限,直接终止循环 break; } count++; // 原有循环内的XML写入逻辑保持不变 var csvItem = line.Split(';'); writer.WriteStartElement("DC8_Recipe"); writer.WriteAttributeString("PlantNo", "01"); writer.WriteAttributeString("FactoryNo", "01"); writer.WriteAttributeString("No", csvItem[0].Replace('"', ' ')); writer.WriteAttributeString("Name", csvItem[2]); writer.WriteAttributeString("ShortName", csvItem[3]); writer.WriteEndElement(); writer.WriteStartElement("RecipeSetValueRow"); writer.WriteAttributeString("SetValue", csvItem[12]); writer.WriteStartElement("Material"); writer.WriteAttributeString("No", csvItem[10]); writer.WriteEndElement(); writer.WriteEndElement(); }
补充说明
你原有代码已经通过lines.RemoveAt(0)删除了CSV的表头行,上述两种方法取到的10行都是表头后的有效业务数据,和需求匹配。另外建议把XmlTextWriter用using语句包裹,会自动释放资源、关闭文件流,不需要手动调用Close(),可以避免资源泄漏问题。
内容的提问来源于stack exchange,提问作者Andrea Ruffo
相关产品推荐
相关产品推荐

