【问题标题】:C# writeline properly show leading zeros save as csvC# writeline 正确显示前导零另存为 csv
【发布时间】:2017-04-19 11:37:10
【问题描述】:

在正确处理 csv 中的前导零时遇到问题,已经尝试在字符串值之前添加 ',但在 csv 文件中它显示 'StringValue

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;
}

【问题讨论】:

  • 你写的值,是你想写的整数类型吗?
  • @SimonPrice,没有。都是字符串
  • 只是出于好奇,你的数字怎么是字符串类型而不是int?
  • @SimonPrice 因为报告表中的给定数字有前导零
  • 现在对我来说很有意义

标签: c# csv text


【解决方案1】:

例如,您需要在每个字段的末尾添加另一个单引号

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

您可以使用string.Format 并使用参数给出字段,例如

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

请注意,许多替代方法可用于将通用列表转换为 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

【讨论】:

  • 试过你的解决方案,但仍然给我同样的问题postimg.org/image/5afizimnf检查链接谢谢
  • 试过但没有显示前导零,更新了我的代码。谢谢
  • 在您的输入字符串中是否有前导零?
  • 在值之前使用=\",最后只添加\",检查我更新的代码
  • @Angelo11292 终于! :) 很高兴它对您有所帮助。
【解决方案2】:

关于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() 以获得更好的可读性。

如果你想显示前导零,你可以在相应的行上使用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" )

【讨论】:

  • 先生尝试了您的解决方案,但出现错误postimg.org/image/pvquwas59检查链接谢谢
  • 得到错误 错误 8 参数 1:无法从 'string' 转换为 'System.IFormatProvider'
【解决方案3】:

在解决问题之前放置一个制表符空间:

"\t" + field

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多