使用C#实现CSV转XML时分号分隔的CSV文件无法读取如何解决
解决方案
方案1:直接配置CsvReader的分隔符(推荐)
你使用的CsvReader默认分隔符为逗号,只需显式指定分隔符为分号即可适配分号分隔的CSV文件,不需要修改原文件内容。
如果你使用的是常用的LumenWorks.Framework.IO.Csv库的CsvReader,修改后的核心代码如下:
writer.WriteStartDocument(); writer.WriteStartElement("DC8_Recipes"); using (CsvReader reader = new CsvReader(path)) { // 新增这行指定分隔符为分号 reader.Delimiter = ";"; reader.ReadHeaders(); while (reader.ReadRecord()) { writer.WriteStartElement("DC8_Recipes"); writer.WriteAttributeString("PlantNo", reader["id_imp"]); writer.WriteAttributeString("No", reader["nome_frm"]); writer.WriteAttributeString("Name", reader["desc_frm"]); writer.WriteEndElement(); } reader.Close(); } writer.WriteEndElement(); writer.WriteEndDocument(); writer.Close(); logText.Text += DateTime.Now + " Convertion Completed\n"; logText.Text += DateTime.Now + " Saving file to: " + savepath + "\n"; try { logText.Text += DateTime.Now + " File save completed!\n"; logText.Text += DateTime.Now + " process END\n"; } catch { }
方案2:兼容逗号、分号两种分隔符
如果需要程序自动适配两种分隔符的CSV文件,可以读取首行后判断哪种分隔符出现次数更多,动态设置分隔符:
using (CsvReader reader = new CsvReader(path)) { // 读取首行判断分隔符 string firstLine = File.ReadLines(path).First(); int commaCount = firstLine.Count(c => c == ','); int semicolonCount = firstLine.Count(c => c == ';'); reader.Delimiter = semicolonCount > commaCount ? ";" : ","; reader.ReadHeaders(); // 后续逻辑和原有代码一致 }
注意事项
不建议直接全局替换分号为逗号:如果CSV字段内容被引号包裹,内部本身就含有分号,全局替换会破坏原有字段结构,导致字段读取错位、数据错乱,使用CsvReader自带的分隔符配置是最稳妥的方案。
内容的提问来源于stack exchange,提问作者Andrea Ruffo
相关产品推荐
相关产品推荐

