2016-12-05 49 views
0

在妥善處理CSV前導零有問題,已經嘗試過的字符串值之前,但在CSV文件時,它顯示'StringValueC#的WriteLine正確顯示前導零保存爲CSV

Sample Output

已經嘗試過\t加入'它的作品,但當我嘗試用記事本打開它顯示一個選項卡。

有沒有其他方法可以解決這個問題?我的主要目的是當它通過csv文件打開時,'一定不能顯示,當我用文本編輯器打開它時,它不會顯示。

這是我當前的代碼

foreach (var i in TransmittedDataBLL.Instance.GetDepEdTextFile(data)) 
     { 
      writer.WriteLine(
       "'" + i.Region.ToString() + ",'" + i.Division.ToString() + ",'" + i.Station.ToString() + ",'" + i.EmployeeNumber.ToString() 
       + "," + i.FirstName.ToString() + "," + i.MiddleInitial.ToString() + "," + i.LastName.ToString() + "," + i.Appelation.ToString() 
       + ",'" + i.DednCode.ToString() + "," + i.DednSubCode.ToString() + ",'" + i.EffectDate.ToString() + ",'" + i.TermDate.ToString() 
       + ",'" + i.AmountStr.ToString() + ",'" + i.LoanAmountStr.ToString() + ",'" + i.InterestAmountStr.ToString() + ",'" + i.OtherChargesStr.ToString() 
       + "," + i.BillingType.ToString() + "," + i.UpdateCode.ToString() 
       ); 
     } 

更新的代碼:

writer.WriteLine("'{0}','{1}','{2}','{3}'", i.Region.ToString(), i.Division.ToString(), i.Station.ToString(), i.EmployeeNumber.ToString()); 

更新的代碼:同樣的問題,前導零不顯示從我的查詢

writer.WriteLine("\"{0}\",\"{1}\",\"{2}\",\"{3}\"", i.Region.ToString(), i.Division.ToString(), i.Station.ToString(), i.EmployeeNumber.ToString()); 

該數據

SAMPLE RAW DATA

全碼:

private void CreateTextFile(string regioncode, string branchcode) 
{ 
    string sFileName = Path.GetRandomFileName(); 
    string fileName = DateTime.Now.ToString("mmddyyyy") + ".csv"; 
    string Serverpath=ConfigurationManager.AppSettings["UploadPath"].ToString() + "\\DepEdReports\\"; 

    TransmittedData data = new TransmittedData(); 
    data.Region = regioncode.Trim(); 
    data.BranchCode = branchcode.Trim(); 

    if (!Directory.Exists(Serverpath)) 
     Directory.CreateDirectory(Serverpath); 

    using (StreamWriter writer = new StreamWriter(Serverpath + sFileName + ".csv"))//Server.MapPath("TextFiles/" + sFileName + ".txt"))) 
    { 
     foreach (var i in TransmittedDataBLL.Instance.GetDepEdTextFile(data)) 
     { 
      //writer.WriteLine(
      // i.Region + "," + i.Division + "," + i.Station + "," + i.EmployeeNumber 
      // + "," + i.FirstName + "," + i.MiddleInitial + "," + i.LastName + "," + i.Appelation 
      // + "," + i.DednCode + "," + i.DednSubCode + "," + i.EffectDate + "," + i.TermDate 
      // + "," + i.AmountStr + "," + i.LoanAmountStr + "," + i.InterestAmountStr + "," + i.OtherChargesStr 
      // + "," + i.BillingType + "," + i.UpdateCode 
      // ); 
      //writer.WriteLine(string.Format("\"{0}\",\"{1}\",\"{2}\",\"{3}\"", i.Region, i.Division, i.Station, i.EmployeeNumber)); 

      writer.WriteLine(GetCSV(i)); 

     } 
    } 

    FileStream fs = null; 
    //fs = File.Open(Server.MapPath("TextFiles/" + sFileName + ".txt"), FileMode.Open); 
    fs = File.Open(Serverpath + sFileName + ".csv", FileMode.Open); 
    byte[] fbyte = new byte[fs.Length]; 
    fs.Read(fbyte, 0, Convert.ToInt32(fs.Length)); 
    fs.Close(); 

    Response.AddHeader("Content-disposition", "attachment;filename=" + fileName); 
    Response.ContentType = "application/octet-stream"; 
    Response.BinaryWrite(fbyte); 
    Response.End(); 

} 

private string GetCSV(TransmittedData i) 
{ 
    string[] list = new string[] 
    { 
     i.Region.ToString(), 
     i.Division.ToString(), 
     i.Station.ToString(), 
     i.EmployeeNumber.ToString(), 
     i.FirstName, 
     i.MiddleInitial, 
     i.LastName, 
     i.Appelation.ToString(), 
     i.DednCode.ToString(), 
     i.DednSubCode.ToString(), 
     i.EffectDate.ToString(), 
     i.TermDate.ToString(), 
     i.AmountStr, 
     i.LoanAmountStr, 
     i.InterestAmountStr, 
     i.OtherChargesStr, 
     i.BillingType.ToString(), 
     i.UpdateCode.ToString() 
    }; 

    string csvLine = "\"" + string.Join(@"", "", list) + "\""; 
    return csvLine; 
} 
+0

值是你寫作,他們是整數類型,你試圖寫? –

+0

@SimonPrice,no。他們都是字符串 – Angelo11292

+0

只是出於好奇,你的數字怎麼是字符串類型,而不是int? –

回答

2

你需要在每場結束例如添加另一個單引號

writer.WriteLine("=\"" + i.Region.ToString() + "\",=\"" + i.Division.ToString() + "\",=\"" 

可以使用string.Format並且給出了用參數字段,例如

writer.WriteLine(string.Format("=\"{0}\",=\"{1}\"", i.Region,i.Division)); 

請注意,很多替代方案a可以將通用列表轉換爲CSV,而不是通過自己的代碼來完成。

How can I convert a list of objects to csv?

Fastest way to convert a list of objects to csv with each object values in a new line

+0

想你的解決方案,但仍然給了我同樣的問題https://postimg.org/image/5afizimnf/檢查,謝謝鏈接 – Angelo11292

+0

燦你用新的代碼更新問題? – Damith

+0

我已經更新的代碼,完成。 – Angelo11292

1

關於https://en.wikipedia.org/wiki/Comma-separated_values#Standardization你應該把所有的值雙引號內或根本不使用引號。

 foreach(var i in TransmittedDataBLL.Instance.GetDepEdTextFile(data)) 
     { 
      writer.WriteLine(GetCSV(i)); 
     } 
    } 

    protected string GetCSV(TransmittedData i) 
    { 
     string[] list = new string[] 
     { 
      i.Region.ToString(), 
      i.Division.ToString(), 
      i.Station.ToString(), 
      i.EmployeeNumber.ToString(), 
      i.FirstName, 
      i.MiddleInitial, 
      i.LastName, 
      i.Appelation.ToString(), 
      i.DednCode.ToString(), 
      i.DednSubCode.ToString(), 
      i.EffectDate.ToString(), 
      i.TermDate.ToString(), 
      i.AmountStr, 
      i.LoanAmountStr, 
      i.InterestAmountStr, 
      i.OtherChargesStr, 
      i.BillingType.ToString(), 
      i.UpdateCode.ToString() 
     }; 

     string csvLine = "\"" + string.Join("\",\"", list) + "\""; 
     return csvLine; 
    } 

如果所有的值都是字符串(如你上面提到的),你可以省略.ToString()更好readibillity。

如果你想前導零顯示,您可以使用string.PadLeft()對應行:

i.Region.ToString().PadLeft(8, '0') //make region to a total length of 8 and fills up with zeroes on the left side 

的情況下,你的一些價值觀不是字符串,但整數你可以簡單地使用.ToString("D8")

+0

嘗試過您的解決方案先生,但給出錯誤https://postimg.org/image/pvquwas59/檢查鏈接謝謝 – Angelo11292

+0

有錯誤錯誤參數1:無法從'字符串'轉換爲'System.IFormatProvider' – Angelo11292

+0

提供我的全部代碼。更新的問題,謝謝! – Angelo11292