【问题标题】:How do I add headers to a csv file with C#?如何使用 C# 将标题添加到 csv 文件?
【发布时间】:2021-09-15 19:28:07
【问题描述】:

我的代码将库存 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));
        }
    }   
}

【问题讨论】:

  • 省点麻烦,使用一个旨在让读取和写入 CSV 文件变得容易的库。
  • 我同意@Xerillio,如果逗号进入描述或任何其他列,此实现将被破坏。
  • 同意@Xerillio。我一直用FileHelpers library,但你可以找到其他几个。

标签: c# csv


【解决方案1】:

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

csvRows.Add(csvHeader);

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

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

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

【讨论】:

    【解决方案2】:

    代替:

    string.Join("\n",csvHeader,"\n",csvRows)
    

    试试:

    string.Join("\n",csvHeader, string.Join("\n",csvRows.ToArray()))
    

    【讨论】:

    • 效果很好,非常感谢!
    【解决方案3】:

    建议在我们有换行或回车操作的所有地方使用字符串生成器。例如,我们可以执行以下操作,而不是使用换行符执行 Join("\n")

            var sb = new StringBuilder();
            sb.AppendLine(csvHeader);
            foreach (var csvRow in csvRows)
            {
                sb.AppendLine(csvRow);
            }
    
            File.WriteAllText("bartact_inventoy1.csv", sb.ToString());
    

    在这里,sb.AppendLine 将产生正确的输出,不仅包含换行符,还包含回车符 (CR)

    PS:在你的例子中你似乎也错过了

    string colID = partAttributes.Attribute("colID").Value
    

    添加到输出中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-02
      • 1970-01-01
      • 2018-06-09
      • 2012-03-07
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多