c# - 如何使用 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));
}
}
}
解决方案
我建议进行一些更改。首先,不要在编写文件时添加标题,而是在添加数据的循环之前将其添加到 csvRows 列表中:
csvRows.Add(csvHeader);
其次,我不会使用 File.WriteAllText 和 Join 而是使用 File.WriteAllLines 让您跳过连接。
File.WriteAllText("C:\\bartact_inventory1.csv", csvRows);
至少在我的测试中可以满足您的要求。还有一个不错的库 (ChoETL) 可以处理写入 CSV 文件以及数据转换等,这可能值得一看。
推荐阅读
- java - 使用 libGDX 在 3D 游戏中有效添加纹理
- iis - 在 IIS 上运行 Vue cli 多页面
- angularjs - ng-repeat 不显示来自 localStorage 的数据
- jenkins - Jenkins 节点上的新文件(“path/tmp.txt”)
- flutter - 从装饰图像中删除 Flutter 可访问性描述
- linux - 如何根据多个不同列的增加值对多个值范围进行排序?
- apache-nifi - Nifi 使用 ExecuteSQL 连接更大的表
- sql - 重复数据问题 SQL
- math - 定义线性规划约束的问题
- javascript - 试图使 nr 限制为 1-10,但提示允许用户选择 13