首页 > 解决方案 > 如何使用 C# 将标题添加到 csv 文件?

问题描述

我的代码将库存 xml 文件转换为 csv 文件。它按预期工作。现在我想添加标题,问题是,当我将标题添加到我的代码中时,项目列表消失了。所需的输出是,总共添加 6 个标头,最后,将相应的值添加到每个标头。下图演示了预期的输出应该是什么。 预期成绩

添加字符串 csvHeader 后,会创建标头,但未显示相应的值。如下所示。 在此处输入图像描述

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Linq;
namespace myApp{
    class WriteToCSVFile{
        static void Main(String[] args){

            // Open file and rename it.
            //string name;
            string xml = File.ReadAllText("C:\\bartact_inventory.xml");
            XDocument Xdoc = XDocument.Parse(xml);
            string csvHeader = "Application/Fitment" + "," + "Part #" + "," + "Item Description" + 
            "," + "Vendor" + "," + "QOH" + "," + "Unit Of Measure";
            XElement xeQBXML = Xdoc.Element("QBXML");
            XElement xeQBXMLMsgsRs = xeQBXML.Element("QBXMLMsgsRs");
            XElement XDEGeneralSummaryReportQueryRs = 
            xeQBXMLMsgsRs.Element("GeneralSummaryReportQueryRs");
            XElement xeReportRet = XDEGeneralSummaryReportQueryRs.Element("ReportRet");
            XElement xeReportData = xeReportRet.Element("ReportData");
            List<XElement> xeDataRows = xeReportData.Elements("DataRow").ToList();
            List<string> csvRows = new List<string>();
            
            for (int rowdata = 0; rowdata < xeDataRows.Count; rowdata++)
            {
                string csvRow = "";
                //string csvHeader = "";
                XElement xeData = xeDataRows[rowdata];
                XElement RowData = xeData.Elements("RowData").ToList().ElementAt(0);
                //Returns Values from RowData which includes year or category and item part number
                string[] partIDs = RowData.Attribute("value").Value.Split(":");
                if(partIDs.Length == 2)
                {
                    csvRow = partIDs[0] + "," + partIDs[1] + ",";
                    //Returns all ColData 
                    List<XElement> xeColData = xeData.Elements("ColData").ToList();
                    for (int colData = 0; colData < xeColData.Count; colData++)
                    {
                        XElement partAttributes = xeColData.ElementAt(colData);
                        string colID = partAttributes.Attribute("colID").Value;
                        string value = partAttributes.Attribute("value").Value;
                        csvRow += value + ",";

                    }
                    // add cr 
                    //File.WriteAllText("C:\\bartact_inventory.csv",);
                    csvRows.Add(csvRow);

                }

            }
            
          File.WriteAllText("C:\\bartact_inventoy1.csv",string.Join("\n",csvHeader,"\n",csvRows));
        }
    }   
}

标签: c#csv

解决方案


我建议进行一些更改。首先,不要在编写文件时添加标题,而是在添加数据的循环之前将其添加到 csvRows 列表中:

csvRows.Add(csvHeader);

其次,我不会使用 File.WriteAllText 和 Join 而是使用 File.WriteAllLines 让您跳过连接。

File.WriteAllText("C:\\bartact_inventory1.csv", csvRows);

至少在我的测试中可以满足您的要求。还有一个不错的库 (ChoETL) 可以处理写入 CSV 文件以及数据转换等,这可能值得一看。


推荐阅读