【问题标题】:How can I utilize StreamWriter to write to a csv file?如何利用 StreamWriter 写入 csv 文件?
【发布时间】:2011-08-29 18:11:52
【问题描述】:

这就是我正在使用的。我正在尝试获取一个 XML 文件,从属性中提取信息,将它们附加在一起,然后将其写入 CSV 文件。我对编程还是比较陌生,而另一位程序员今天不在办公室,所以我真的需要一些帮助。

我的第一个问题是关于 StringBuilder。我是否需要在我的 StringBuilder 末尾有一个 AppendLine,以便从 foreach 循环输出的每个字符串都在一个新行上?我需要在 foreach 循环中这样做吗?

我的第二个问题是关于将我的字符串实际写入 CSV 文件。它看起来像吗?

swOutputFile.WriteLine(strAppendedJobData)

我认为这也会进入 foreach 循环,但我不太确定。

感谢您的帮助,我希望我的问题措辞易于理解。

//Create a stream writer to write the data from returned XML job ticket to a new CSV
        StreamWriter swOutputFile;
        string strComma = ",";
        swOutputFile = new StreamWriter(new FileStream("C:\\Dev\\AppendedJobData.csv", FileMode.Create, FileAccess.Write, FileShare.Read));

        //Get nodes from returned XML ticket
        XmlNodeList xmlJobs = xdResults.SelectNodes("/Updates/Jobs/Job");
        //Pull out data from XML attributes
        foreach (XmlElement xeJobUpdate in xmlJobs)
        {
            //Break down the job data
            string strProjectID = xeJobUpdate.GetAttribute("SharpOwlProjectID");
            string strJobNumber = xeJobUpdate.GetAttribute("JobNumber");
            string strClientCode = xeJobUpdate.GetAttribute("SharpOwlClientCode");
            string strClient = xeJobUpdate.GetAttribute("Client");
            string strVCAOffice = xeJobUpdate.GetAttribute("VCAOffice");
            string strLoadStatus = xeJobUpdate.GetAttribute("LoadStatus");

            //Build the string to be added to the new CSV file

            StringBuilder sbConcatJob = new StringBuilder();
            sbConcatJob.Append(strProjectID).Append(strComma).Append(strJobNumber)
                .Append(strComma).Append(strClientCode).Append(strComma).Append(strClient).Append(strComma)
                .Append(strVCAOffice).Append(strComma).Append(strLoadStatus).Append(strComma);
            string strAppendedJobData = sbConcatJob.ToString();

【问题讨论】:

  • 您使用的是哪个版本的 .NET?还有,你有什么问题?

标签: c# string csv stringbuilder streamwriter


【解决方案1】:

如果你想做得更优雅一点,你可以这样做:

 using(StreamWriter swOutputFile = new StreamWriter(new FileStream("C:\\Dev\\AppendedJobData.csv", FileMode.Create, FileAccess.Write, FileShare.Read)))
    {
        //Get nodes from returned XML ticket
        XmlNodeList xmlJobs = xdResults.SelectNodes("/Updates/Jobs/Job");
        //Pull out data from XML attributes
        foreach (XmlElement xeJobUpdate in xmlJobs)
        {
           List<String> lineItems = new List<String>();
           lineItems.add(xeJobUpdate.GetAttribute("SharpOwlProjectID"));
           //add all the other items

           swOutputFile.WriteLine(String.Join(',', myLine.ToArray()));



        }
    //after the loop you close the writer
   }

    //all the work is done much easier

【讨论】:

  • 正是我的想法。一更正。 List(T).Join 用于合并列表,您需要做的是 String.Join(',', myLine.ToArray())
  • StreamWriter 是 IDisposable,所以它应该放在一个“使用”块中,这样可以保证调用 Close
  • 感谢您的帮助,如果我能接受多个答案,我也会接受您的,我选择了 Phil 的答案,因为这是我使用的答案。
【解决方案2】:

我的第一个问题是关于 字符串生成器。我需要有一个 AppendLine 在我的末尾 StringBuilder,让每个字符串 foreach 循环的输出位于 新队?我需要这样做吗 在 foreach 循环内?

我唯一的建议是尝试一下,因为您似乎没有尝试过。这是您学习的唯一方法。

swOutputFile.WriteLine(strAppendedJobData)

这会将整行文本写入文件。

【讨论】:

    【解决方案3】:

    你真的有两个选择:

    如果您在 foreach 循环内调用 sbConcatJob.AppendLine(),您可以在一个字符串生成器中构建文件的内容,然后在 foreach 循环外调用 swOutputFile.Write(sbConcatJob.ToString()) 以写入文件。

    如果您保持代码不变,您可以在 foreach 循环中添加 sw.OutputFile.WriteLine(sbConcatJob.ToString()) 并一次写入一行文件。

    【讨论】:

      猜你喜欢
      • 2020-01-08
      • 2016-05-03
      • 2014-06-22
      • 2020-05-23
      • 1970-01-01
      • 2011-10-29
      • 2014-02-22
      • 2018-08-24
      • 1970-01-01
      相关资源
      最近更新 更多