2011-05-20 538 views
2

所以這就是我正在與之合作。我正在嘗試使用XML文件,從屬性中提取信息,將它們附加在一起,然後將其寫入CSV文件。我對編程還比較陌生,另一位程序員今天不在辦公室,所以我真的可以使用一些幫助。如何使用StreamWriter寫入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(); 
+3

您正在使用哪個版本的.NET?另外,你有什麼問題? – 2011-05-20 15:19:36

回答

1

你真的在這裏有兩種選擇:

如果調用sbConcatJob.AppendLine() foreach循環裏面,你可以建立在一個字符串生成的文件的內容,然後調用swOutputFile.Write(sbConcatJob.ToString())外的foreach循環寫入文件。

如果現在保留代碼,則可以在foreach循環中添加sw.OutputFile.WriteLine(sbConcatJob.ToString()),並一次將文件寫入一行。

7
,如果你想這樣做更優雅一點,你可以做這樣的事情

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 
+0

正是我在想什麼。一個更正。 List(T).Join用於合併列表,你需要做的事情就像String.Join(',',myLine.ToArray()) – 2011-05-20 15:26:56

+0

StreamWriter是IDisposable,所以它應該放在'using'塊中,關閉'保證被調用。 – 2011-05-20 15:32:46

+0

你是對的,編輯它裏面。 – fixagon 2011-05-20 15:35:51

2

我的第一個問題,關於 StringBuilder的。我是否需要在我的 StringBuilder末尾有一個 AppendLine,以便每個從foreach循環輸出的字符串 位於 新行?我是否需要在foreach循環中執行 ?

我唯一的建議,因爲它似乎你沒有嘗試過這將是嘗試它。這是你學習的唯一方法。

swOutputFile.WriteLine(strAppendedJobData)

這整個文本行寫入文件。