C# 在C中创建固定宽度的文件#

C# 在C中创建固定宽度的文件#,c#,C#,在C#中创建固定宽度文件的最佳方法是什么。我有一大堆字段要写出长度。说20,80.10,2等,全部左对齐。有没有一个简单的方法可以做到这一点 您不能使用标准文本文件吗?您可以逐行读取数据。使用String.Format() 尝试使用myString.PadRight(totalLengthForField“”)您可以使用StreamWriter,并在Write(string)调用中使用string.Format()创建给定字段的正确宽度的字符串。使用string类的.PadRight函数(用于左

在C#中创建固定宽度文件的最佳方法是什么。我有一大堆字段要写出长度。说20,80.10,2等,全部左对齐。有没有一个简单的方法可以做到这一点

您不能使用标准文本文件吗?您可以逐行读取数据。

使用String.Format()


尝试使用myString.PadRight(totalLengthForField“”)

您可以使用StreamWriter,并在Write(string)调用中使用string.Format()创建给定字段的正确宽度的字符串。

使用string类的.PadRight函数(用于左对齐数据)。因此:

handle.WriteLine(s20.PadRight(20));
handle.WriteLine(s80.PadRight(80));
handle.WriteLine(s10.PadRight(10));
handle.WriteLine(s2.PadRight(2));

你是说你想用空格填充右边的所有数字


如果是这样,或者应该让您走上正轨。

您可以使用ascienceoding.UTF8.GetBytes(text)将其转换为字节数组。然后将字节数组作为固定大小的记录写入文件


UTF8在表示某些字符所需的字节数上有所不同,UTF16更容易预测,每个字符2个字节。

您可以使用string.Format轻松地用空格填充值 e、 g


试试FileHelpers:www.FileHelpers.com

下面是一个例子:

之前的各种填充/格式化文章已经足够了,但是您可能对实现ISerializable感兴趣


这是一篇msdn文章,内容是关于

这是我为可配置的固定宽度文件写入模块制作的系统。它配置了一个XML文件,相关部分如下所示:

<WriteFixedWidth Table="orders" StartAt="1" Output="Return">
  <Position Start="1" Length="17" Name="Unique Identifier"/>
  <Position Start="18" Length="3" Name="Error Flag"/>
  <Position Start="21" Length="16" Name="Account Number" Justification="right"/>
  <Position Start="37" Length="8" Name="Member Number"/>
  <Position Start="45" Length="4" Name="Product"/>
  <Position Start="49" Length="3" Name="Paytype"/>
  <Position Start="52" Length="9" Name="Transit Routing Number"/>
</WriteFixedWidth>

该引擎是StringBuilder,它比将不可变字符串连接在一起要快,尤其是在处理多兆字节文件时。

我正在对字符串使用扩展方法,是的,XML注释对此可能很有用,但如果您希望其他开发人员重复使用

public static class StringExtensions
{

    /// <summary>
    /// FixedWidth string extension method.  Trims spaces, then pads right.
    /// </summary>
    /// <param name="self">extension method target</param>
    /// <param name="totalLength">The length of the string to return (including 'spaceOnRight')</param>
    /// <param name="spaceOnRight">The number of spaces required to the right of the content.</param>
    /// <returns>a new string</returns>
    /// <example>
    /// This example calls the extension method 3 times to construct a string with 3 fixed width fields of 20 characters, 
    /// 2 of which are reserved for empty spacing on the right side.
    /// <code>
    ///const int colWidth = 20;
    ///const int spaceRight = 2;
    ///string headerLine = string.Format(
    ///    "{0}{1}{2}",
    ///    "Title".FixedWidth(colWidth, spaceRight),
    ///    "Quantity".FixedWidth(colWidth, spaceRight),
    ///    "Total".FixedWidth(colWidth, spaceRight));
    /// </code>
    /// </example>
    public static string FixedWidth(this string self, int totalLength, int spaceOnRight)
    {
        if (totalLength < spaceOnRight) spaceOnRight = 1; // handle silly use.

        string s = self.Trim();

        if (s.Length > (totalLength - spaceOnRight))
        {
            s = s.Substring(0, totalLength - spaceOnRight);
        }

        return s.PadRight(totalLength);
    }
}

Darren对这个问题的回答启发了我使用扩展方法,但我没有扩展
String
,而是扩展了
StringBuilder
。我写了两种方法:

public static StringBuilder AppendFixed(this StringBuilder sb, int length, string value)
{
    if (String.IsNullOrWhiteSpace(value))
        return sb.Append(String.Empty.PadLeft(length));

    if (value.Length <= length)
        return sb.Append(value.PadLeft(length));
    else
        return sb.Append(value.Substring(0, length));
}

public static StringBuilder AppendFixed(this StringBuilder sb, int length, string value, out string rest)
{
    rest = String.Empty;

    if (String.IsNullOrWhiteSpace(value))
        return sb.AppendFixed(length, value);

    if (value.Length > length)
        rest = value.Substring(length);

    return sb.AppendFixed(length, value);
}

不一定,文本文件可能不会被另一个C#应用程序读取,而是需要特定格式文本文件的主框架。不过有一个警告:如果数据长度超过指定的宽度,则不会被截断。因此,您必须使用数据。任何字段上的子字符串(0,宽度)都可能比宽度长,这会很快变得冗长(并且重复/不干燥)。只是因为我错过了它,所以我的速度很慢,但是如果显示结果,那么字体使用的宽度也需要固定。我不得不说这是一个非常好的主意,喜欢它+1我无法引用
名称空间。集成
,能否请您提供有关此的更多详细信息。Vikas,您可以在此处找到更多信息。如果您的XML文档使用名称空间,则使用名称空间.Integration…当然,您可以使用标准的.NET FileStream编写文件。可以使用以下库:
public static class StringExtensions
{

    /// <summary>
    /// FixedWidth string extension method.  Trims spaces, then pads right.
    /// </summary>
    /// <param name="self">extension method target</param>
    /// <param name="totalLength">The length of the string to return (including 'spaceOnRight')</param>
    /// <param name="spaceOnRight">The number of spaces required to the right of the content.</param>
    /// <returns>a new string</returns>
    /// <example>
    /// This example calls the extension method 3 times to construct a string with 3 fixed width fields of 20 characters, 
    /// 2 of which are reserved for empty spacing on the right side.
    /// <code>
    ///const int colWidth = 20;
    ///const int spaceRight = 2;
    ///string headerLine = string.Format(
    ///    "{0}{1}{2}",
    ///    "Title".FixedWidth(colWidth, spaceRight),
    ///    "Quantity".FixedWidth(colWidth, spaceRight),
    ///    "Total".FixedWidth(colWidth, spaceRight));
    /// </code>
    /// </example>
    public static string FixedWidth(this string self, int totalLength, int spaceOnRight)
    {
        if (totalLength < spaceOnRight) spaceOnRight = 1; // handle silly use.

        string s = self.Trim();

        if (s.Length > (totalLength - spaceOnRight))
        {
            s = s.Substring(0, totalLength - spaceOnRight);
        }

        return s.PadRight(totalLength);
    }
}
public static StringBuilder AppendFixed(this StringBuilder sb, int length, string value)
{
    if (String.IsNullOrWhiteSpace(value))
        return sb.Append(String.Empty.PadLeft(length));

    if (value.Length <= length)
        return sb.Append(value.PadLeft(length));
    else
        return sb.Append(value.Substring(0, length));
}

public static StringBuilder AppendFixed(this StringBuilder sb, int length, string value, out string rest)
{
    rest = String.Empty;

    if (String.IsNullOrWhiteSpace(value))
        return sb.AppendFixed(length, value);

    if (value.Length > length)
        rest = value.Substring(length);

    return sb.AppendFixed(length, value);
}
string rest;    

StringBuilder clientRecord = new StringBuilder();
clientRecord.AppendFixed(40, doc.ClientName, out rest); 
clientRecord.AppendFixed(40, rest);
clientRecord.AppendFixed(40, doc.ClientAddress, out rest);
clientRecord.AppendFixed(40, rest);